当一个用户请求 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
实例。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),
]
注意:
<int:name>
来捕获整型参数。如果不包含转换器,则会匹配除了 /
外的任何字符。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")
。备案信息: 粤ICP备15087711号-2
Copyright © 2008-2024 啊嘎哇在线工具箱 All Rights.
本站所有资料来源于网络,版权归原作者所有,仅作学习交流使用,如不慎侵犯了您的权利,请联系我们。