路由 URL configuration¶
路由定义¶
from django.urls import path, re_path
urlpatterns = [
# 常规路由
path('', views.index),
# 正则路由
# (?P<phone_num>...) Django 命名分组语法
re_path(r'^phone/(?P<phone_num>1[3-9]\d{9})/$', views.phone_demo),
]
路径转换器(路由变量)¶
str
- 匹配除了'/'
之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。int
- 匹配 0 或任何正整数。返回一个int
。slug
- 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。比如,building-your-1st-django-site
。uuid
- 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如,075194d3-6885-417e-a8a8-6c931e272f00
。返回一个UUID
实例。path
- 匹配非空字段,包括路径分隔符'/'
。它允许你匹配完整的 URL 路径而不是像str
那样匹配 URL 的一部分。
# urls.py
path(
'example/<str:username>/<int:user_id>/<slug:article_slug>/<uuid:article_uuid>/<path:file_path>/',
views.example_view,
name='example_with_all_converters'
)
# views.py
def example_view(request, username, user_id, article_slug, article_uuid, file_path):
# 参数类型:
# username: str
# user_id: int
# article_slug: str
# article_uuid: UUID对象
# file_path: str(可能包含斜杠)
pass
反向解析¶
模板中使用路由¶
from django.urls import path
from . import views
urlpatterns = [
# ...
path("articles/<int:year>/", views.year_archive, name="news-year-archive"),
# ...
]
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
在Python中使用
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse("news-year-archive", args=(year,)))
路由命名¶
- 给路由起别名
# name=phone
re_path(r'^phone/(?P<phone_num>1[3-9]\d{9})/$', views.phone_demo,name=phone),
命名空间¶
# 在index.urls要指定app_namee
path('', include('index.urls', namespace='home')),
path('urlconf/', include(('uniform_resource_locator.urls', 'index'), namespace='index')),
命名空间的作用¶
- 避免命名冲突:当项目包含多个应用时,防止不同应用中出现同名的 URL 模式或模板文件
- 提高代码可维护性:明确指定资源所属的应用,使代码更清晰
- 支持应用复用:允许同一应用在项目中被多次使用(多个实例)
路由重定向¶
1、Django 如何处理一个请求¶
- Django 确定使用根 URLconf 模块。通常,这是
ROOT_URLCONF
设置的值,但如果传入HttpRequest
对象拥有urlconf
属性(通过中间件设置),它的值将被用来代替ROOT_URLCONF
设置。 - Django 加载该 Python 模块并寻找可用的
urlpatterns
。它是django.urls.path()
和(或)django.urls.re_path()
实例的序列(sequence)。 - Django 会按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止,并与
path_info
匹配。 - 一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个Python 函数(或基于类的视图 class-based view )。视图会获得如下参数:
- 一个
HttpRequest
实例。 - 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。
- 关键字参数由路径表达式匹配的任何命名部分组成,并由
django.urls.path()
或django.urls.re_path()
的可选kwargs
参数中指定的任何参数覆盖。 - 如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。参加下面的错误处理( Error handling )。