一、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/了

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

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. how to increase an regular array length in java?

    Arrays in Java are of fixed size that is specified when they are declared. To increase the size of t ...

  2. Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

    很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中.下面浅析下引起该错误的原因以及平台兼容性问题. 一. ...

  3. FTP 服务器

    先使用mstsc检验网络连通性\\192.168.196.177\OraCDuser:domai\userpassword: 1234UAT 和prod 网络隔绝

  4. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .

    OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形.但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三 ...

  5. linux的学习系列 9--网络通信

    ping 命令 ping 命令会向网络上的主机发送应答请求,根据响应信息可以判断远程主机是否可用. ping 命令的语法: $ping hostname or ip-address 如果网络畅通,很快 ...

  6. SQLite错误总结 error code 19: constraint failed

    SQLite错误总结 1. android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed错误原 ...

  7. Lucene + Hadoop 分布式搜索运行框架 Nut 1.0a9转自http://www.linuxidc.com/Linux/2012-02/53113.htm

    1.概述 不管程序性能有多高,机器处理能力有多强,都会有其极限.能够快速方便的横向与纵向扩展是Nut设计最重要的原则,以此原则形成以分布式并行计算为核心的架构设计.以分布式并行计算为核心的架构设计是N ...

  8. java基本输入类型数据System.out.println()或System.out.print()

  9. cocos2d-x 3.x 触摸事件

    HelloWorldScene.h bool touchBegan(cocos2d::Touch*touch, cocos2d::Event*event);//触摸开始,返回bool类型 void t ...

  10. HDU 3696 Farm Game

    SPFA最长路,思路如下: 先对题目中给出的每条边建边,权值为转化率:增加一个终点S,每个节点到S建边,权值为该物品的单价. 假设X物品最终转化为了Y物品,那么转化之后得到的钱就是 W[x]*转化率1 ...