django_2.0_请求处理
当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:
- Django确定要使用的根URLconf模块。通常,这是
ROOT_URLCONF
设置的值,但如果传入HttpRequest
对象具有urlconf
属性(由中间件设置),则将使用其值代替ROOT_URLCONF
设置。 - Django加载Python模块并查找变量
urlpatterns
。这应该是Python列表django.urls.path()
和/或django.urls.re_path()
实例。 - Django按顺序遍历每个URL模式,并在匹配请求的URL的第一个模式停止。
- 一旦其中一个URL模式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。视图传递以下参数:
- 一个例子
HttpRequest
。 - 如果匹配的URL模式未返回任何命名组,则正则表达式中的匹配将作为位置参数提供。
- 关键字参数由路径表达式匹配的任何命名部分组成,由或者 可选
kwargs
参数中指定的任何参数覆盖 。django.urls.path()
django.urls.re_path()
- 一个例子
- 如果没有URL模式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。请参阅下面的错误处理
示例:
这是一个示例URLconf:
from django.urls import path from . import views urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
笔记:
- 要从URL捕获值,请使用尖括号。
- 捕获的值可以选择包括转换器类型。例如,用于
<int:name>
捕获整数参数。如果未包含转换器/
,则匹配除字符之外的任何字符串。 - 没有必要添加前导斜杠,因为每个URL都有。例如,它
articles
不是/articles
。
示例请求:
- 请求
/articles/2005/03/
与列表中的第三个条目匹配。Django会调用该函数 。views.month_archive(request, year=2005, month=3)
/articles/2003/
将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个是第一个要通过的测试。随意利用订单插入这样的特殊情况。在这里,Django会调用该函数views.special_case_2003(request)
/articles/2003
不匹配任何这些模式,因为每个模式都要求URL以斜杠结尾。/articles/2003/03/building-a-django-site/
将匹配最终模式。Django会调用该函数 。views.article_detail(request, year=2003, month=3,slug="building-a-django-site")