codecamp

Django4.0 URL调度器-Django如何处理一个请求

当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法:

1.Django 确定使用根 ​URLconf ​模块。通常,这是 ​ROOT_URLCONF ​设置的值,但如果传入 ​HttpRequest ​对象拥有 ​urlconf ​属性(通过中间件设置),它的值将被用来代替 ​ROOT_URLCONF ​设置。
2.Django 加载该 Python 模块并寻找可用的 ​urlpatterns ​。它是 ​django.urls.path()​ 和(或) ​django.urls.re_path()​ 实例的序列(​sequence​)。
3.Django 会按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止,并与 ​path_info ​匹配。
4.一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个Python 函数(或基于类的视图 ​class-based view​ )。视图会获得如下参数:

  • 一个 ​HttpRequest ​实例。
  • 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。
  • 关键字参数由路径表达式匹配的任何命名部分组成,并由 ​django.urls.path()​ 或 ​django.urls.re_path()​ 的可选 ​kwargs ​参数中指定的任何参数覆盖。

5.如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。参考下面的错误处理( ​Error handling​ )。 

例如:

下面是一个简单的 ​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/​ 会匹配 URL 列表中的第三项。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/​ 会匹配 URL 列表中的最后一项。Django 会调用函数 ​views.article_detail(request, year=2003, month=3, slug="building-a-django-site")​ 。


Django4.0 URL调度器-概况
Django4.0 URL调度器-路径转换器
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }