Django之路: 基本命令与网址进阶
一、Django 基本命令 |
温馨提示:如果你想学习Django,那么就请您从现在开始按照笔记记录一步一步的用手把代码敲出来,千万不要偷懒哦。。。。。
1、创建一个Django project
- django-admin.py startproject project
或者
- django-admin startproject project
一个project为一个项目,后面project是项目名称,根据自己的需求可以自己自定义修改,必须要符合Python的变量命名规则(以下划线或字母开头)
2、新建app
- django-admin.py startapp app
- 或python manage.py startapp app
第一种我自己测试了可以使用第二种,必须在当前文件夹下有一个manage.py文件才可以执行。后面的app是穿件app的名称
3、同步数据库
- python manage.py syncdb
- 注意:Django 1.7.1及以上的版本需要用以下命令
- python manage.py makemigrations
- python manage.py migrate
这种方法可以创建表,当在models.py中新增类时,运行他就可以自动在数据库中创建表了,不用手动创建。
备注:对已有的models进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具south,相见Django数据库迁移一章。
4、使用开发服务器
在开发服务器的时候使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,还是建议只是用来测试不要在生产环境中使用。
- python manage.py runserver
- # 当提示端口被占用的时候,可以用其它端口:
- python manage.py runserver 8001
- python manage.py runserver 9999
- (当然也可以kill掉占用端口的进程)
- # 监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
- python manage.py runserver 0.0.0.0:8000
- # 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
- # 访问对应的 ip加端口,比如 http://172.16.20.2:8000
5、清空数据库
- python manage.py flush
此命令会询问是yes还是no,选择yes就会把数据全部清楚掉,只留下空表。
6、创建超级管理员
- python manage.py createsuperuser
- # 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
- # 修改 用户密码可以用:
- python manage.py changepassword username
7、导入导出数据
- python manage.py dumpdata appname > appname.json #导出
- python manage.py loaddata appname.json #导入
关于数据库操作 详见:数据导入数据迁移,现在了解有这个用法就可以了。
8、Django项目环境终端
- python manage.py shell
如果安装了bpython或者ipython会自动用他们的界面,推荐是安装bpython。
这个命令和直接运行python或bpython进入shell的区别是:你可以在一个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便。
9、数据库命令行
- python manage.py dbshell
Django会自动进入在settings.py中设置的数据库,如果是MySQL或者postgreSQL,会要求输入数据库用户名和密码。在这个终端可以进行数据库的SQL语句,如果您对SQL比较熟悉,可能更喜欢这种方式。
10、更多命令
- 终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
注:以上是基本的常用命令,建议在看下面的内容之前能够把上面的所有命令理解明白。
二、Django 视图与网址 |
一、先新建一个项目(project),名称为mysite
- django-admin startproject mysite
- 或django-admin.py startproject mysite
注:如果是用Linux源码安装的,或者用pip安装的,也可以用django-admin.py
运行后,如果没有报错的话,可以看到以下目录,如果有错误请查看 Django之路:简介以及环境
- root@w:~# tree mysite
- mysite
- ├── manage.py
- └── mysite
- ├── __init__.py
- ├── settings.py
- ├── urls.py
- └── wsgi.py
- 1 directory, 5 files
注:mysite目录中是一些项目的设置settings.py文件,总的urls配置文件urls.py以及部署服务器时用到的wsgi.py文件,__init__.py是python包的目录结构必须的,与调用有关。
在外层的mysite目录下
二、新建一个应用(app),名称叫learn
- root@w:~/mysite# python manage.py startapp learn #learn是一个app的名称
在mysite目录下多了一个learn目录,其中learn下的文件是:
- root@w:~/mysite# tree learn/
- learn/
- ├── admin.py
- ├── __init__.py
- ├── models.py
- ├── tests.py
- └── views.py
- 0 directories, 5 files
注:Django 1.8.x 以上的,还有一个 migrations 文件夹。Django 1.9.x 还会在 Django 1.8 的基础上多出一个 apps.py 文件。但是这些都与本文无关。
把新定义的app加到settings.py中的INSTALL_APPS中
修改 mysite/mysite/settings.py
- INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'learn', #把learn加到settings.py中
- )
注:新键的app如果不加到INSTALL_APPS中的话,django就不能自动找到app中的模版文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件),后面会学到这些文件是用来做什么的。
二、定义视图函数(访问页面时的内容)
在learn目录中,把views.py打开,修改其中的源代码,改成下面的内容
- root@w:~# sudo vi mysite/learn/views.py #目标文件
- sudo: 无法解析主机:w
- #coding:utf-8 #编码声明为utf-8
- from django.http import HttpResponse
- def index(request):
- return HttpResponse(u"欢迎访问吴老二的博客")
第一行是什么编码utf-8,因为在代码中用到了中文,如果不声明默认不会显示中文。
第二行引入HttpResponse,它是用来向网页返回内容的,就想python中的print一样,只是HttpResponse是把内容显示到网页上。
第三行定义了一个index()函数,第一个参数必须是request,与网页发来的请求有关,request变量是里面包含get或post的内容,用户浏览器,系统等信息在里面(后面会有详细介绍,这里先了解以下)。
函数返回了一个HttpResponse对象、可以经过一些处理,最终显示几个字到网页上。
那么页面的内容已经做好了,用什么url来访问呢?那么就请耐心的继续看下去。
三、定义视图函数相关的URL(网址)(访问什么网址可以返回定义的内容)
我们可以打开 mysite/mysite/urls.py 在这个文件里进行一些修改:
由于Django版本对urls.py进行了一些更改:
Django 1.7.x 及以下的版本看到的内容是这样的:
- root@w:~# sudo vi mysite/mysite/urls.py
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- admin.autodiscover()
- urlpatterns = patterns('',
- url(r'^$', 'learn.views.index'), #修改后的内容
- # url(r'^blog/', include('blog.urls')),
- url(r'^admin/', include(admin.site.urls)),
- )
Django 1.8.x及以上,Django官网鼓励(或要求)先引入,在使用:
- root@w:~# sudo vi mysite/mysite/urls.py
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- from learn import views as learn_views
- urlpatterns = patterns('',
- url(r'^$', 'learn.views.index'),
- url(r'^admin/', include(admin.site.urls)),
- )
以上修改保存后,我们来看以下效果!
在终端上运行python manage.py runserver
- root@w:~/mysite# python manage.py runserver
- Validating models...
- 0 errors found
- December 23, 2015 - 08:13:51
- Django version 1.6.10, using settings 'mysite.settings'
- Starting development server at http://127.0.0.1:8000/
- Quit the server with CONTROL-C.
- [23/Dec/2015 08:14:31] "GET / HTTP/1.1" 200 30
注:是在mysite目录下运行的,如果没有出现以外的话在本机上访问http://127.0.0.1:8000就会出现下面的内容:
注意:如果你用的是虚拟机,想在另外一台电脑上访问的话要用python manage.py ip:port格式,比如监听所有IP:
我的虚拟机上的IP是192.168.1.30,以下在本地测试:
- root@w:~/mysite# python manage.py runserver 192.168.1.30:8001
- Validating models...
- 0 errors found
- December 23, 2015 - 08:21:57
- Django version 1.6.10, using settings 'mysite.settings'
- Starting development server at http://192.168.1.30:8001/
- Quit the server with CONTROL-C.
- [23/Dec/2015 08:22:13] "GET / HTTP/1.1" 200 30
访问的页面是:
Django中的urls.py是用正则进行匹配的,如果不熟悉的可以学习以下正则表达式以及Python正则表达式。
三、Django 视图与网址进阶 |
一、在网页上做加减法
1、采用/add/?a=4&b=8 这样的GET方法进行
- root@w:~# django-admin startproject zqxt_views
- root@w:~# cd zqxt_views/
- root@w:~/zqxt_views# python manage.py startapp calc
自动生成目录大致如下:
- root@w:~# tree zqxt_views
- zqxt_views
- ├── calc
- │ ├── admin.py
- │ ├── __init__.py
- │ ├── models.py
- │ ├── tests.py
- │ └── views.py
- ├── manage.py
- └── zqxt_views
- ├── __init__.py
- ├── settings.py
- ├── urls.py
- └── wsgi.py
- 2 directories, 12 files
修改以下calc/views.py文件
- root@w:~# sudo vi zqxt_views/calc/views.py
- from django.shortcuts import render
- from django.http import HttpResponse
- def add(request):
- a = request.GET['a']
- b = request.GET['b']
- c = int(a)+int(b)
- return HttpResponse(str(c))
注:request.GET类似于一个字典,更好的办法是用request.GET.get('a', 0)当没有传递a的时候默认是a为0
接着修改文件zqxt_views/urls.py ,添加一个网址来对应我们刚才新建的视图函数。
Django 1.7.x 及以下的同学可能看到的是这样的:
- root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- admin.autodiscover()
- urlpatterns = patterns('',
- # Examples:
- url(r'^add/$', 'calc.views.add', name='add'),
- # url(r'^blog/', include('blog.urls')),
- url(r'^admin/', include(admin.site.urls)),
- )
Django 1.8.x 及以上,Django官方鼓励(或要求)先引入,在使用,地版本的Django也可以这样使用:
- root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
- from django.conf.urls import url
- from django.contrib import admin
- from calc import views as calc_views
- urlpatterns = [
- url(r'^add/', calc_views.add, name='add'), # 注意修改了这一行
- url(r'^admin/', admin.site.urls),
- ]
我们打开开发服务器并访问看看
- root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
- Validating models...
- 0 errors found
- December 23, 2015 - 08:57:30
- Django version 1.6.10, using settings 'zqxt_views.settings'
- Starting development server at http://192.168.1.30:8001/
- Quit the server with CONTROL-C.
- [23/Dec/2015 08:57:39] "GET /add/ HTTP/1.1" 500 61882
浏览器打开
这个不能算是错误,因为我们没有传值进去,我们在后面加上?a=3&b=9,即http://192.168.1.30:8001/add/?a=3&b=9就可以看出网页上显示一个12,可以试着改变a和b的值,看看网页上的值是不是a和b的和
2、采用/add/3/9/这样的网址的方式
我们可以修改文件zqxt_views/calc/views.py,在定义一个函数,可以重新定义,也可以直接修改。这里直接修改。
- root@w:~# sudo vi zqxt_views/calc/views.py
- from django.shortcuts import render
- from django.http import HttpResponse
- def add(request, a, b):
- c = int(a)+int(b)
- return HttpResponse(str(c))
接着修改zqxt_views/zqxt_views/urls.py文件中,修改url,如果你是添加的,可以直接修改也可以直接添加。Django 1.7.x 及以下:
- root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- admin.autodiscover()
- urlpatterns = patterns('',
- # Examples:
- url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
- # url(r'^blog/', include('blog.urls')),
- url(r'^admin/', include(admin.site.urls)),
- )
Django 1.8.x及以上:
- root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
- sudo: 无法解析主机:w
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- admin.autodiscover()
- urlpatterns = patterns('',
- # Examples:
- url(r'^add/(\d+)/(\d+)/$', 'calc_views.views.add', name='add'),
- # url(r'^blog/', include('blog.urls')),
- url(r'^admin/', include(admin.site.urls)),
- )
我们可以看到网址中多了(\d+),正则表达式中\d代表一个数字,+代表一个或多个前面的字符,写在一起\d+就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被views.py中的对应视图函数接收。
我在差看以下http://192.168.1.30:8001/add/234/567/,看看是什么效果。
- root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
- Validating models...
- 0 errors found
- December 23, 2015 - 09:17:00
- Django version 1.6.10, using settings 'zqxt_views.settings'
- Starting development server at http://192.168.1.30:8001/
- Quit the server with CONTROL-C.
- [23/Dec/2015 09:17:03] "GET /add/234/567/ HTTP/1.1" 200 3
浏览器访问:
二、url中的name【技能提升】
在看以下urls.py中的代码
- root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
- sudo: 无法解析主机:w
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- admin.autodiscover()
- urlpatterns = patterns('',
- # Examples:
- url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
- # url(r'^blog/', include('blog.urls')),
- url(r'^admin/', include(admin.site.urls)),
- )
在开始的时候想用/add/3/6/,后来需求发生变化,又想改成/2__add__4/这样的格式,但是网页中已经有很多地方已经写死了,就是:
- <a href="/add/3/6/">计算 3+6</a>
这样就会出现修改了urls.py后,对应的模版,还有视图用的跳转,以及models.py中也可以能有获取网址的地方。都要修改,这样的话工作量太大了,有时候忘记了也就不好找。
解决以上问题需要在终端上输入
- root@w:~/zqxt_views# python manage.py shell
- Python 2.7.10 (default, Oct 14 2015, 16:09:02)
- [GCC 5.2.1 20151010] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
- (InteractiveConsole)
- >>> from django.core.urlresolvers import reverse
- >>> reverse('add', args=(3,6))
- '/add/3/6/'
- >>> reverse('add', args=(333,666))
- '/add/333/666/'
reverse接收url中的name作为第一个参数,我们在代码中就可以通过reverse()来获取对应的网址(这个网址可以用来做跳转,也可以用来做计算相关的网址),只要对应的url的name不改,就不用改代码中的网址。
在网页的模版中也一样,可以很方便的使用。
- 不带参数的:
- {% url 'name' %}
- 带参数的:参数可以是变量名
- {% url 'name' 参数 %}
- 例如:
- <a href="{% url 'add2' 3 6 %}">link</a>
上面的代码渲染成最终的页面是
- <a href="/add/3/6/">link</a>
这样就可以通过{% 'add' 3 6 %} 获取到对应的网址/add/3/6/
当urls.py进行更改,前提是不改name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:
- url(r'^new_add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
注意看重点newadd变成了new_add,这时{% url 'add' 3 6 %}就会渲染对应的网址成/new_add/3/6/,reverse函数也一样会获取新的网址,这样改网址时只需要改urls.py中的正则表达式,其他的地方都“自动”跟着变了。
如何让以前的/add/3/6/自动跳转到新的网址上呢?要知道Django不会帮你做这个,方法如下:
在zqxt_views/calc/views.py 写一个跳转的函数
- from django.http import HttpResponseRedirect
- from django.core.urlresolvers import reverse
- def old_add2_redirect(request, a, b):
- return HttpResponseRedirect(
- reverse('add2', args=(a, b))
- )
在zqxt_views/zqxt_views/urls.py中:
- url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
- url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
这里的add2就是/add/3/6的配置,这样在输入add/3/6/的时候会自动跳转到/new_add/3/6/了
开始的时候不觉得,用的久了,你会发现“死网址”的方法很糟糕。
Django之路: 基本命令与网址进阶的更多相关文章
- Python之路,Day8 - Socket编程进阶
Python之路,Day8 - Socket编程进阶 本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...
- Django之路
备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...
- Django:学习笔记(7)——模型进阶
Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...
- Django 视图与网址进阶
一 .在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 1 2 3 django-admin.py startproject zqxt_views cd zqxt_ ...
- 【Django视图与网址进阶004】
一.在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 django-admin.py startproject zqxt_views cd zqxt_views p ...
- Django之路: 模版篇
一.Django 模版 上章是介绍简单的把django.http.HttpResponse的内容显示到网页上,下面就介绍以下如何使用渲染模版的方法来显示内容.本节代码是基于Django 1.8,但 ...
- Django之路:QuerySet API,后台和表单
一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...
- Django之路:模型(数据库)和自定义Field以及数据表的更改
一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...
- Django之路:简介以及环境
(sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6 Windows ...
随机推荐
- 最近客户的apache+php环境运行很慢解决
描述:[Wed Jul 24 15:49:11 2013] [warn] (OS 64)指定的网络名不再可用. : winnt_accept: Asynchronous AcceptEx faile ...
- PHP的反射机制【转载】
PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse-engineer class, interface,function,method and extensio ...
- Lvs+Keepalived+Bind+web构建高可用负载均衡系统
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hatech.blog.51cto.com/8360868/1417899 --- ...
- wpf之数据触发器DataTrigger
wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: ...
- wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选
在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...
- 【jsp 防盗链】Referer的简单使用
在web系统中,盗链的问题时有发生,即复制一个url地址,在另一个地方也能访问. 在jsp中通过request对象可以获取客户请求信息和表单信息,在客户请求头信息中,"Referer&quo ...
- php mysql 实现消息队列
最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...
- POJ1308 Is It A Tree?
题目大意:和HDU1272-小希的迷宫题目一样, 如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径 ...
- Android 开发——如何显示 GIF 动画
gif 图动画在 android 中还是比较常用的,比如像新浪微博中,有很多 gif 图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实 github 上有很多开源 ...
- 为什么Hbase能实现快速的查询
你的快速是指什么? 是根据亿级的记录中快速查询,还是说以实时的方式查询数据. A:如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey, 就能实现快速的查询 ...