一、Django 基本命令

温馨提示:如果你想学习Django,那么就请您从现在开始按照笔记记录一步一步的用手把代码敲出来,千万不要偷懒哦。。。。。

1、创建一个Django project

  1. django-admin.py startproject project

或者

  1. django-admin startproject project

一个project为一个项目,后面project是项目名称,根据自己的需求可以自己自定义修改,必须要符合Python的变量命名规则(以下划线或字母开头)

2、新建app

  1. django-admin.py startapp app
  2. python manage.py startapp app

第一种我自己测试了可以使用第二种,必须在当前文件夹下有一个manage.py文件才可以执行。后面的app是穿件app的名称

3、同步数据库

  1. python manage.py syncdb
  2.  
  3. 注意:Django 1.7.1及以上的版本需要用以下命令
  4. python manage.py makemigrations
  5. python manage.py migrate

这种方法可以创建表,当在models.py中新增类时,运行他就可以自动在数据库中创建表了,不用手动创建。

备注:对已有的models进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具south,相见Django数据库迁移一章。

4、使用开发服务器

在开发服务器的时候使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,还是建议只是用来测试不要在生产环境中使用。

  1. python manage.py runserver
  2.  
  3. # 当提示端口被占用的时候,可以用其它端口:
  4. python manage.py runserver 8001
  5. python manage.py runserver 9999
  6. (当然也可以kill掉占用端口的进程)
  7.  
  8. # 监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
  9. python manage.py runserver 0.0.0.0:8000
  10. # 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
  11. # 访问对应的 ip加端口,比如 http://172.16.20.2:8000

5、清空数据库

  1. python manage.py flush

此命令会询问是yes还是no,选择yes就会把数据全部清楚掉,只留下空表。

6、创建超级管理员

  1. python manage.py createsuperuser
  2.  
  3. # 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
  4.  
  5. # 修改 用户密码可以用:
  6. python manage.py changepassword username

 7、导入导出数据

  1. python manage.py dumpdata appname > appname.json #导出
  2. python manage.py loaddata appname.json    #导入

关于数据库操作 详见:数据导入数据迁移,现在了解有这个用法就可以了。

8、Django项目环境终端

  1. python manage.py shell

如果安装了bpython或者ipython会自动用他们的界面,推荐是安装bpython。

这个命令和直接运行python或bpython进入shell的区别是:你可以在一个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便。

9、数据库命令行

  1. python manage.py dbshell

Django会自动进入在settings.py中设置的数据库,如果是MySQL或者postgreSQL,会要求输入数据库用户名和密码。在这个终端可以进行数据库的SQL语句,如果您对SQL比较熟悉,可能更喜欢这种方式。

10、更多命令

  1. 终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。

注:以上是基本的常用命令,建议在看下面的内容之前能够把上面的所有命令理解明白。

二、Django 视图与网址

一、先新建一个项目(project),名称为mysite

  1. django-admin startproject mysite
  2. django-admin.py startproject mysite

注:如果是用Linux源码安装的,或者用pip安装的,也可以用django-admin.py

运行后,如果没有报错的话,可以看到以下目录,如果有错误请查看 Django之路:简介以及环境

  1. root@w:~# tree mysite
  2. mysite
  3. ├── manage.py
  4. └── mysite
  5.     ├── __init__.py
  6.     ├── settings.py
  7.     ├── urls.py
  8.     └── wsgi.py
  9.  
  10. 1 directory, 5 files

注:mysite目录中是一些项目的设置settings.py文件,总的urls配置文件urls.py以及部署服务器时用到的wsgi.py文件,__init__.py是python包的目录结构必须的,与调用有关。

在外层的mysite目录下

 二、新建一个应用(app),名称叫learn

  1. root@w:~/mysite# python manage.py startapp learn #learn是一个app的名称

在mysite目录下多了一个learn目录,其中learn下的文件是:

  1. root@w:~/mysite# tree learn/
  2. learn/
  3. ├── admin.py
  4. ├── __init__.py
  5. ├── models.py
  6. ├── tests.py
  7. └── views.py
  8.  
  9. 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

  1. INSTALLED_APPS = (
  2.     'django.contrib.admin',
  3.     'django.contrib.auth',
  4.     'django.contrib.contenttypes',
  5.     'django.contrib.sessions',
  6.     'django.contrib.messages',
  7.     'django.contrib.staticfiles',
  8.     'learn',    #把learn加到settings.py中
  9. )

注:新键的app如果不加到INSTALL_APPS中的话,django就不能自动找到app中的模版文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件),后面会学到这些文件是用来做什么的。

 二、定义视图函数(访问页面时的内容)

在learn目录中,把views.py打开,修改其中的源代码,改成下面的内容

  1. root@w:~# sudo vi mysite/learn/views.py #目标文件
  2. sudo: 无法解析主机:w
  3.  
  4. #coding:utf-8    #编码声明为utf-8
  5. from django.http import HttpResponse
  6. def index(request):
  7.         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 及以下的版本看到的内容是这样的:

  1. root@w:~# sudo vi mysite/mysite/urls.py 
  2.  
  3. from django.conf.urls import patterns, include, url
  4.  
  5. from django.contrib import admin
  6. admin.autodiscover()
  7.  
  8. urlpatterns = patterns('',
  9.      url(r'^$', 'learn.views.index'),  #修改后的内容
  10.     # url(r'^blog/', include('blog.urls')),
  11.  
  12.     url(r'^admin/', include(admin.site.urls)),
  13. )

Django 1.8.x及以上,Django官网鼓励(或要求)先引入,在使用:

  1. root@w:~# sudo vi mysite/mysite/urls.py 
  2.  
  3. from django.conf.urls import patterns, include, url
  4.  
  5. from django.contrib import admin
  6. from learn import views as learn_views
  7.  
  8. urlpatterns = patterns('',
  9.      url(r'^$', 'learn.views.index'),
  10.     url(r'^admin/', include(admin.site.urls)),
  11. )

以上修改保存后,我们来看以下效果!

在终端上运行python manage.py runserver

  1. root@w:~/mysite# python manage.py runserver
  2. Validating models...
  3.  
  4. 0 errors found
  5. December 23, 2015 - 08:13:51
  6. Django version 1.6.10, using settings 'mysite.settings'
  7. Starting development server at http://127.0.0.1:8000/
  8. Quit the server with CONTROL-C.
  9. [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,以下在本地测试:

  1. root@w:~/mysite# python manage.py runserver 192.168.1.30:8001
  2. Validating models...
  3.  
  4. 0 errors found
  5. December 23, 2015 - 08:21:57
  6. Django version 1.6.10, using settings 'mysite.settings'
  7. Starting development server at http://192.168.1.30:8001/
  8. Quit the server with CONTROL-C.
  9. [23/Dec/2015 08:22:13] "GET / HTTP/1.1" 200 30

访问的页面是:

Django中的urls.py是用正则进行匹配的,如果不熟悉的可以学习以下正则表达式以及Python正则表达式。

三、Django 视图与网址进阶

一、在网页上做加减法

1、采用/add/?a=4&b=8 这样的GET方法进行

  1. root@w:~# django-admin startproject zqxt_views
  2. root@w:~# cd zqxt_views/
  3. root@w:~/zqxt_views# python manage.py startapp calc

自动生成目录大致如下:

  1. root@w:~# tree zqxt_views
  2. zqxt_views
  3. ├── calc
  4.    ├── admin.py
  5.    ├── __init__.py
  6.    ├── models.py
  7.    ├── tests.py
  8.    └── views.py
  9. ├── manage.py
  10. └── zqxt_views
  11.     ├── __init__.py
  12.     ├── settings.py
  13.     ├── urls.py
  14.     └── wsgi.py
  15.  
  16. 2 directories, 12 files

修改以下calc/views.py文件

  1. root@w:~# sudo vi zqxt_views/calc/views.py 
  2.  
  3. from django.shortcuts import render
  4. from django.http import HttpResponse
  5. def add(request):
  6.         a = request.GET['a']
  7.         b = request.GET['b']
  8.         c = int(a)+int(b)
  9.         return HttpResponse(str(c))

注:request.GET类似于一个字典,更好的办法是用request.GET.get('a', 0)当没有传递a的时候默认是a为0

接着修改文件zqxt_views/urls.py ,添加一个网址来对应我们刚才新建的视图函数。

Django 1.7.x 及以下的同学可能看到的是这样的:

  1. root@w:~# sudo vi zqxt_views/zqxt_views/urls.py 
  2.  
  3. from django.conf.urls import patterns, include, url
  4.  
  5. from django.contrib import admin
  6. admin.autodiscover()
  7.  
  8. urlpatterns = patterns('',
  9.     # Examples:
  10.      url(r'^add/$', 'calc.views.add', name='add'),
  11.     # url(r'^blog/', include('blog.urls')),
  12.  
  13.     url(r'^admin/', include(admin.site.urls)),
  14. )

Django 1.8.x 及以上,Django官方鼓励(或要求)先引入,在使用,地版本的Django也可以这样使用:

  1. root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
  2.  
  3. from django.conf.urls import url
  4. from django.contrib import admin
  5. from calc import views as calc_views
  6.  
  7.  
  8. urlpatterns = [
  9.     url(r'^add/', calc_views.add, name='add'),  # 注意修改了这一行
  10.     url(r'^admin/', admin.site.urls),
  11. ]

我们打开开发服务器并访问看看

  1. root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
  2. Validating models...
  3.  
  4. 0 errors found
  5. December 23, 2015 - 08:57:30
  6. Django version 1.6.10, using settings 'zqxt_views.settings'
  7. Starting development server at http://192.168.1.30:8001/
  8. Quit the server with CONTROL-C.
  9. [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,在定义一个函数,可以重新定义,也可以直接修改。这里直接修改。

  1. root@w:~# sudo vi zqxt_views/calc/views.py
  2.  
  3. from django.shortcuts import render
  4. from django.http import HttpResponse
  5. def add(request, a, b):
  6.         c = int(a)+int(b)
  7.         return HttpResponse(str(c))

接着修改zqxt_views/zqxt_views/urls.py文件中,修改url,如果你是添加的,可以直接修改也可以直接添加。Django 1.7.x 及以下:

  1. root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
  2.  
  3. from django.conf.urls import patterns, include, url
  4.  
  5. from django.contrib import admin
  6. admin.autodiscover()
  7.  
  8. urlpatterns = patterns('',
  9.     # Examples:
  10.      url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
  11.     # url(r'^blog/', include('blog.urls')),
  12.  
  13.     url(r'^admin/', include(admin.site.urls)),
  14. )

Django 1.8.x及以上:

  1. root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
  2. sudo: 无法解析主机:w
  3.  
  4. from django.conf.urls import patterns, include, url
  5.  
  6. from django.contrib import admin
  7. admin.autodiscover()
  8.  
  9. urlpatterns = patterns('',
  10.     # Examples:
  11.      url(r'^add/(\d+)/(\d+)/$', 'calc_views.views.add', name='add'),
  12.     # url(r'^blog/', include('blog.urls')),
  13.  
  14.     url(r'^admin/', include(admin.site.urls)),
  15. )

我们可以看到网址中多了(\d+),正则表达式中\d代表一个数字,+代表一个或多个前面的字符,写在一起\d+就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被views.py中的对应视图函数接收。

我在差看以下http://192.168.1.30:8001/add/234/567/,看看是什么效果。

  1. root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
  2. Validating models...
  3.  
  4. 0 errors found
  5. December 23, 2015 - 09:17:00
  6. Django version 1.6.10, using settings 'zqxt_views.settings'
  7. Starting development server at http://192.168.1.30:8001/
  8. Quit the server with CONTROL-C.
  9. [23/Dec/2015 09:17:03] "GET /add/234/567/ HTTP/1.1" 200 3

浏览器访问:

二、url中的name【技能提升】

在看以下urls.py中的代码

  1. root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
  2. sudo: 无法解析主机:w
  3.  
  4. from django.conf.urls import patterns, include, url
  5.  
  6. from django.contrib import admin
  7. admin.autodiscover()
  8.  
  9. urlpatterns = patterns('',
  10.     # Examples:
  11.      url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
  12.     # url(r'^blog/', include('blog.urls')),
  13.  
  14.     url(r'^admin/', include(admin.site.urls)),
  15. )
url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),这里的name='add'是做什么用的呢?

在开始的时候想用/add/3/6/,后来需求发生变化,又想改成/2__add__4/这样的格式,但是网页中已经有很多地方已经写死了,就是:

  1. <a href="/add/3/6/">计算 3+6</a>

这样就会出现修改了urls.py后,对应的模版,还有视图用的跳转,以及models.py中也可以能有获取网址的地方。都要修改,这样的话工作量太大了,有时候忘记了也就不好找。

解决以上问题需要在终端上输入

  1. root@w:~/zqxt_views# python manage.py shell
  2. Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
  3. [GCC 5.2.1 20151010] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. (InteractiveConsole)
  6. >>> from django.core.urlresolvers import reverse
  7. >>> reverse('add', args=(3,6))
  8. '/add/3/6/'
  9. >>> reverse('add', args=(333,666))
  10. '/add/333/666/'

reverse接收url中的name作为第一个参数,我们在代码中就可以通过reverse()来获取对应的网址(这个网址可以用来做跳转,也可以用来做计算相关的网址),只要对应的url的name不改,就不用改代码中的网址。

在网页的模版中也一样,可以很方便的使用。

  1. 不带参数的:
  2. {% url 'name' %}
  3. 带参数的:参数可以是变量名
  4. {% url 'name' 参数 %}
  5.  
  6. 例如:
  7. <a href="{% url 'add2' 3 6 %}">link</a>

上面的代码渲染成最终的页面是

  1. <a href="/add/3/6/">link</a>

这样就可以通过{% 'add' 3 6 %} 获取到对应的网址/add/3/6/

当urls.py进行更改,前提是不改name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:

  1. 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 写一个跳转的函数

  1. from django.http import HttpResponseRedirect
  2. from django.core.urlresolvers import reverse
  3.  
  4.  
  5. def old_add2_redirect(request, a, b):
  6.     return HttpResponseRedirect(
  7.         reverse('add2', args=(a, b))
  8.     )

在zqxt_views/zqxt_views/urls.py中:

  1.  url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
  2.     url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

这里的add2就是/add/3/6的配置,这样在输入add/3/6/的时候会自动跳转到/new_add/3/6/了

开始的时候不觉得,用的久了,你会发现“死网址”的方法很糟糕。

Django之路: 基本命令与网址进阶的更多相关文章

  1. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  2. Django之路

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...

  3. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  4. Django 视图与网址进阶

    一 .在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 1 2 3 django-admin.py startproject zqxt_views cd zqxt_ ...

  5. 【Django视图与网址进阶004】

    一.在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 django-admin.py startproject zqxt_views cd zqxt_views p ...

  6. Django之路: 模版篇

    一.Django 模版  上章是介绍简单的把django.http.HttpResponse的内容显示到网页上,下面就介绍以下如何使用渲染模版的方法来显示内容.本节代码是基于Django 1.8,但 ...

  7. Django之路:QuerySet API,后台和表单

    一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...

  8. Django之路:模型(数据库)和自定义Field以及数据表的更改

    一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...

  9. Django之路:简介以及环境

     (sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6 Windows ...

随机推荐

  1. 最近客户的apache+php环境运行很慢解决

    描述:[Wed Jul 24 15:49:11 2013] [warn] (OS 64)指定的网络名不再可用.  : winnt_accept: Asynchronous AcceptEx faile ...

  2. PHP的反射机制【转载】

    PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse-engineer class, interface,function,method and extensio ...

  3. Lvs+Keepalived+Bind+web构建高可用负载均衡系统

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hatech.blog.51cto.com/8360868/1417899 --- ...

  4. wpf之数据触发器DataTrigger

    wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: ...

  5. wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选

    在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...

  6. 【jsp 防盗链】Referer的简单使用

    在web系统中,盗链的问题时有发生,即复制一个url地址,在另一个地方也能访问. 在jsp中通过request对象可以获取客户请求信息和表单信息,在客户请求头信息中,"Referer&quo ...

  7. php mysql 实现消息队列

    最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...

  8. POJ1308 Is It A Tree?

    题目大意:和HDU1272-小希的迷宫题目一样, 如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径 ...

  9. Android 开发——如何显示 GIF 动画

    gif 图动画在 android 中还是比较常用的,比如像新浪微博中,有很多 gif 图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实 github 上有很多开源 ...

  10. 为什么Hbase能实现快速的查询

    你的快速是指什么? 是根据亿级的记录中快速查询,还是说以实时的方式查询数据. A:如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey,  就能实现快速的查询 ...