django-admin.py startproject tutorial 新建项目
cd tutorial
django-admin.py startapp quickstart
使用下面的命令创建表:
python manage.py migrate
然后创建一个用户名为 admin 密码 password123 的管理员:
python manage.py createsuperuser
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。
django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的。所以说我们要
做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Response。
为了激活中间件组件,把它添加到你的settings模块的MIDDLEWARE_CLASSES列表中,在MIDDLEWARE_CLASSES里,
每个中间件
组件通过一个字符串来表示:完整的到中间件的类名的Python路径,例如,这里是通过django-admin.py
startproject创建的
默认的MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
为了激活中间件组件,把它添加到你的settings模块的MIDDLEWARE_CLASSES列表中,在MIDDLEWARE_CLASSES里,
每个中间件组件通过一个字符串来表示:完整的到中间件的类名的Python路径,例如,这里是通过django-
admin.py startproject创建的 默认的MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
Middleware并不是Django所独有的东西,在其他的Web框架中也有这种概念。在Django中,Middleware可以渗入处理流程的四个阶段:request,view,response和exception,相应的,在每个Middleware类中都有rocess_request,process_view, process_response 和 process_exception这四个方法。你可以定义其中任意一个活多个方法,这取决于你希望该Middleware作用于哪个处理阶段。每个方法都可以直接返回response对象。
Middleware是在Django BaseHandler的load_middleware方法执行时加载的,加载之后会建立四个列表作为处理器的实例变量:
_request_middleware:process_request方法的列表
_view_middleware:process_view方法的列表
_response_middleware:process_response方法的列表
_exception_middleware:process_exception方法的列表
Django的中间件是在其配置文件(settings.py)的MIDDLEWARE_CLASSES元组中定义的。在MIDDLEWARE_CLASSES中,中间件组件用字符串表示:指向中间件类名的完整Python路径。
Django.contrib是一个强大的功能包,是Django的标准库。Django的标准库存放在 django.contrib 包中。每个
子包都是一个独立的附加功能包。 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包
。
admin : 自动化的站点管理工具。
admindocs : 为Django admin站点提供自动文档。
auth : Django的用户验证框架。
comments : 一个评论应用,关于这个应用的更多信息请参见Django的官方网站。
contenttypes : 这是一个用于引入文档类型的框架,每个安装的Django模块作为一种独立的文档类型。 这个框
架主要在Django内部被其他应用使用,它主要面向Django的高级开发者。可以通过阅读源码来了解关于这个框架
的更多信息,源码的位置在 django/contrib/contenttypes/。
csrf : 这个模块用来防御跨站请求伪造(CSRF)。
databrowse:帮助你浏览数据的Django应用。
flatpages : 一个在数据库中管理单一HTML内容的模块。
formtools : 一些列处理表单通用模式的高级库。
gis : 为Django提供GIS(Geographic Information Systems)支持的扩展。 举个例子,它允许你的Django模型
保存地理学数据并执行地理学查询。请参看http://geodjango.org/上的文档。
humanize : 一系列 Django 模块过滤器,用于增加数据的人性化。
localflavor:针对不同国家和文化的混杂代码段。例如,它包含了验证美国的邮编 以及爱尔兰的身份证号的方
法。
markup : 一系列的 Django 模板过滤器,用于实现一些常用标记语言。
redirects : 用来管理重定向的框架。
sessions : Django 的会话框架。
sitemaps : 用来生成网站地图的 XML 文件的框架。
sites : 一个让你可以在同一个数据库与 Django 安装中管理多个网站的框架。
syndication : 一个用 RSS 和 Atom 来生成聚合订阅源的的框架。
webdesign : 对设计者非常有用的Django扩展。到编写此文时,它只包含一个模板标签{% lorem %}。
urls.py 的规则:
URL配置(URLconf)就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函
数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码
。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。
要弄清Django如何处理URL配置规则,先要了解几个概念。
URL模式:URL模式是指在Django urls模块中,名为urlpatterns的元组中包含的每一个值。通常由patterns方法
生成urlpatterns元组的内容。
URL分解器:通常,一个URL分解器对应一个URL配置模块,它可以包含多个URL模式,也可以包含多个其他URL分解
器。通过这种包含结构设计,实现Django对URL的层级解析。URL分解器是Django实现app与项目解耦的关键。通常
由include方法操作的URL配置模块,最终会被解释成为URL分解器。
匹配结果:匹配结果是指当URL被正确匹配时,需返回的匹配结果。
每个URL模式都需要指定如下几个内容:
一个正则表达式字符串。
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串。
可选的要传递给视图函数的默认参数(字典形式)。
一个可选的name参数。
路径前缀,加在视图函数路径字符串的前面组成完整的视图函数路径。可以通过patterns方法的第一个参数指定
。
例如:(r'^hello/$',hello),模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特
定的含义:上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。
^hello/$匹配hello/字符串,即在网址http://127.0.0.1:8000/hello/找到hello/后,使用hello()函数显示出来
,如果没有'$'结尾,则网址中输入hello1/;hello2/都会对应以hello()函数显示出来。
通常一个 URL 分解器对应一个 URL 配置模块,它可以包含多个URL模式,也可以包含多个其他URL分解器。通过
这种包含结构设计,实现Django对URL的层级解析。
URL 分解器是 Django 实现 app 与项目解耦的关键。通常由 include 方法操作的 URL 配置模块,最终会被解释
成为 URL 分解器。
每个URL分解器都需要指定如下几个内容:
一个正则表达式字符串。URL开始部分是否匹配正则表达式,如匹配,去除成功匹配部分后余下部分匹配包含的
URL模式和URL分解器。
URL配置模块名或URL配置模块的引用。
可选的关键参数(字典形式)。
可选的App名称。
可选的名称空间名字。
一般来说,一个请求先会从 URL 匹配器 RegexURLPattern 进入,RegexURLPattern 真正发挥匹配作用的是
RegexURLResolver 对象,并调用 RegexURLResolver.resolve() 启动了解析,一切从这里开始。
urls.py的配置写法一般有三种方式。
1. 第一种是导入视图的方式,就是 The Django Book 里面样例的写法:
from blog.views import index
url(r'^nowamagic/', index)
2. 第二种方法是视图处理方法,看代码就知道是怎么回事了。
url(r'^nowamagic/', 'test.views.index')
3. 第三种是把模型与视图写在前缀里。
urlpatterns = patterns('blog.views',
url(r'^nowamagic$', 'index' )
url(r'^nowamagic/\d{2}/$', 'index')
url(r'^nowamagic/(?P\d{2})/$', 'index' )
大同小异。
下面来个详细的代码总结:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# test_client modeltest urls
(r'^test_client/', include('modeltests.test_client.urls')),
(r'^test_client_regress/', include('regressiontests.test_client_regress.urls')),
# File upload test views
(r'^file_uploads/', include('regressiontests.file_uploads.urls')),
# Always provide the auth system login and logout views
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
(r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
# test urlconf for {% url %} template tag
(r'^url_tag/', include('regressiontests.templates.urls')),
# django built-in views
(r'^views/', include('regressiontests.views.urls')),
# test urlconf for middleware tests
(r'^middleware/', include('regressiontests.middleware.urls')),
# admin view tests
(r'^test_admin/', include('regressiontests.admin_views.urls')),
(r'^generic_inline_admin/', include('regressiontests.generic_inline_admin.urls')),
# admin widget tests
(r'widget_admin/', include('regressiontests.admin_widgets.urls')),
(r'^utils/', include('regressiontests.utils.urls')),
# test urlconf for syndication tests
(r'^syndication/', include('regressiontests.syndication.urls')),
# conditional get views
(r'condition/', include('regressiontests.conditional_processing.urls')),
# middleware exceptions tests
(r'middleware_exceptions/', include('regressiontests.middleware_exceptions.urls')),
# special headers views
(r'special_headers/', include('regressiontests.special_headers.urls')),
)
运行Django项目的方法很多,这里主要介绍一下常用的方法。一种是在开发和调试中经常用到runserver方法,使
用Django自己的web server;另外一种就是使用fastcgi,uWSGIt等协议运行Django项目,这里以uWSGIt为例。
runserver方法
runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行,主要在测试和开发
中使用,使用方法如下:
Usage: manage.py runserver [options] [optional port number, or ipaddr:port]
# python manager.py runserver # default port is 8000
# python manager.py runserver 8080
# python manager.py runserver 127.0.0.1:9090
WSGI,全称Web Server Gateway Interface,或者Python Web Server Gateway Interface,是为Python语言定义
的Web服务器和Web应用程序或框架之间的一种简单而通用的接口,基于现存的CGI标准而设计的。WSGI其实就是一
个网关(Gateway),其作用就是在协议之间进行转换。
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。注意uwsgi是一种通信协议,而uWSGI是实现
uwsgi协议和WSGI协议的Web服务器。uWSGI具有超快的性能、低内存占用和多app管理等优点。
一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码:
>>> q1 = Entry.objects.filter(headline__startswith="What")
Django 使用 django.db.models.ForeignKey 定义多对一关系
ManyToManyField 用来定义多对多关系,用法和其他Field 字段类型一样:在模型中做为一个类属性包含进来。
ManyToManyField 需要一个位置参数:和该模型关联的类。