Django如何处理请求
当用户从Django支持的站点请求页面时,这是由路由层确定要执行的Python代码:
- Django确定要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入的 HttpRequest 对象具有 urlconf 属性(由中间件设置),则将使用其值代替 ROOT_URLCONF 设置。。
- Django加载Python模块并查找变量urlpatterns。urlpatterns是由django.conf.urls.url() 实例的Python列表。
- Django按顺序遍历每个URL模式,匹配到一个之后立即匹配,直接执行对应的视图函数。
- 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图。视图传递以下参数:
- HttpRequest的一个实例。
- 如果匹配的正则表达式未返回任何命名组,则正则表达式中的匹配将作为位置参数提供。
- 关键字参数由正则表达式匹配的任何命名组组成,由django.conf.urls.url()的可选kwargs参数中指定的任何参数覆盖。
- 如果没有正则表达式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。
路由层
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$',views.hello),
url(r'^helloword/$',views.helloword),
]
注意:第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数
网站首页路由
url(r'^$',views.home)
网站不存在页面
url(r'',views.error)
url()函数有四个参数, 两个是必须的: regex 和 view , 两个可选的: kwargs 和 name
-
regex 是 regular expression 的简写,这是字符串中的模式匹配的一种语法,Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。
-
view 当 Django匹配了一个正则表达式就会调用指定的view逻辑, 上面代码中会调用app01/views.py中的hello函数。
-
kwargs任意关键字参数可传一个字典至目标view。
-
name命名你的 URL, 使 url 在 Django 的其他地方使用, 特别是在模板中。
一个路由匹配示例:
from django.conf.urls import url
from app01 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/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
示例请求:
- 请求 /articles/2005/03/ 与列表中的第三个条目匹配。Django会调用该函数 。views.month_archive(request, ‘2005’, ‘03’)
- /articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个条目需要两个月的