Django处理一个请求
-
项目启动后根据 settings ROOT_URLCONF 决定项目根URLconf
-
urlpatterns是django.conf.urls.url()实例的一个Python列表
-
Django依次匹配每个URL模式,匹配成功后就停止
-
Django匹配成功,调用相应视图函数(或一个基于类的视图),视图参数如下
一个HttpRequest实例
如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数传递给视图函数
关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖
-
如果没有匹配的正则表达式,或者过程中抛出一个异常,Django将调用一个适当的错误处理视图
详细Django请求流程
-
modwsgi:Django实现,处理原始二进制http请求,Python标准wsgi协议,封装输出request对象
-
Request Middlewares:Django扩展,请求中间件,安全验证,Session处理等,对所有request应用的场景,可定制,有顺序
-
URLConf:Django实现,url路由系统,从上到下,依次匹配
-
View Middlewares:Django扩展,对url匹配后的中间件处理,可定制
-
View:视图函数,汇总Template所需Context
-
Model:数据模型,通过Mangers管理器去外部DB取得数据
-
Template:前端模板,包括Filters和Tags
-
Response Middlewares:Django扩展,响应中间件
-
modwsgi:Django实现,拆分为原始二进制http响应数据流,返回给浏览器
URL常见写法
# urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ] # views.py def special_case_2003(request): return HttpResponse("2003") def year_archive(request, year): return HttpResponse('year_archive: %s' % year) def month_archive(request, year, month): return HttpResponse('year, month: %s, %s' % (year, month)) def article_detail(request, year, month, day): return HttpResponse('article_detail: %s, %s, %s' % (year, month, day))
说明:
-
若要从URL中捕获一个值,只需要在它的周围放置一对圆括号,如 ([0-9]{4}) 捕获4为整数
-
不需要添加一个前导的反斜杠,因为每个url都有,如该是articles而不是/articles
-
每个正则表达式前面的r''是可选的但是建议加上,它告诉Python这个字符串是“原始的”--字符串中任何字符串都不应该转义
-
默认捕捉到的都是字符串
-
/articles/2005/03/ 请求将匹配列表中的第三个模式, Django将调⽤函数views.month_archive(request, '2005', '03')
-
/articles/2005/03/?blog=hi 和上面相同
-
/articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个模式要求⽉份应该是两个数字
-
/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配
-
/articles/2003 匹配第一个,浏览器默认转换为 /articles/2003/
-
/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003',month='03', day='03'),key名称必须和捕获的分组名称一致
URL多种组合写法
urlpatterns = [ url(r'^community/', include('django_website.aggregator.urls')), url(r'^contact/', include('django_website.contact.urls')), ] urlpatterns += [ url(r'^log/', include(other_log)), ]
错误处理
当Django找不到一个匹配请求的URL的正则表达式时,或者抛出一个异常时,Django将调用一个错误处理视图
默认错误处理视图
-handler404 -- 参见django.conf.urls.handler404
-handler500 -- 参见django.conf.urls.handler500
-handler403 -- 参见django.conf.urls.handler403
-handler400 -- 参见django.conf.urls.handler40
传递额外选项
urlpatterns = [ url(r'^articles/([0-9]{4})/$', views.year_archive,{'foo': 'bar'}), ]
会覆盖url中捕获的值
URL反向解析几种方法
-
在模板中使用 {% url 'url_name' xxx %}
-
在视图中使用 django.shortcuts.reverse() reverse('url_name', kwargs={‘key1’:'value1'}) 或 reverse('url_name', args=('key1',))