概况
为了给一个应用设计URL,你需要创建一个Python 模块,通常被称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。
映射可短可长,随便你。它可以引用其它的映射。而且,因为它是纯粹的Python 代码,它可以动态构造。
Django 还提供根据当前语言翻译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/ would match the first pattern in the list, not the second one, because the patterns are tested in order, and the first one is the first test to pass. Feel free to exploit the ordering to insert special cases like this. Here, Django would call the function views.special_case_2003(request)
-
/articles/2003 would not match any of these patterns, because each pattern requires that the URL end with a slash.
-
/articles/2003/03/building-a-django-site/ 会匹配 URL 列表中的最后一项。Django 会调用函数 views.article_detail(request, year=2003, month=3, slug="building-a-django-site") 。
网友评论