urls.py
路由分为项目路由(根路由)和应用路由
1. Django执行请求的顺序
- 访问URL(在视图使用链接参考 反向解析 reverse())
- 根URLconf模块
- 应用URLconf模块
- 加载并寻找可用的urlpatterns
- 依次匹配每个URL模式(顺序很重要)
- 正常:导入+调用匹配的视图
- 异常:调用错误处理视图(自定义可参考[路由实例])
2. 示例
2.1. 根路由(项目路由)
# project/urls.py
from django.urls import path, include
urlpatterns = [
path('community/', include('example.urls')), # 路由转发到应用
path('<username>/blog/', include('foo.urls.blog')), # 捕获变量也会一并转发
]
2.2. 应用路由
# app/urls.py
from django.urls import path
from . import views
app_name = 'example' # 命名空间
urlpatterns = [
path('articles/2003/', views.special_case_2003, name='special'), # name 用于反向解析
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),
]
# 比如 `/articles/2003/03/building-a-django-site/` 将匹配最后一个,并调用
views.article_detail(request, year=2003, month=3, slug="building-a-django-site")
注意
<>
捕获URL中的一段传给视图函数
a.<question_text>
默认,字符串
b.<int:year>
转换为 int 叫做路径转换器- path() 写路径时不用加前面的/
/article/2003
将什么也匹配不到
3. 路径转换器
转换器 | 描述 | 例子 |
---|---|---|
str | 默认,匹配所有非空字符串 | 不用指明,比如上面的 <username> |
int | 匹配0和正整数 | |
slug | 匹配任何ASCII字符以及连接符和下划线 | 比如 building-your-1st-django-site |
uuid | 匹配uuid格式,返回一个UUID对象 | 匹配值必须使用破折号,所有字母必须小写,比如 075194d3-6885-417e-a8a8-6c931e272f00 |
path | 匹配任何非空字符串,可以包含’/‘ | 可以匹配整个url而非一段URL字符串 |