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)),
)

 

url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),这里的name='add'是做什么用的呢?

在开始的时候想用/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/了

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

 

posted @ 2015-12-23 17:50  吴老二  阅读(930)  评论(0编辑  收藏  举报