urls.py

路由分为项目路由(根路由)和应用路由

1. Django执行请求的顺序

  1. 访问URL(在视图使用链接参考 反向解析 reverse())
  2. 根URLconf模块
  3. 应用URLconf模块
  4. 加载并寻找可用的urlpatterns
  5. 依次匹配每个URL模式(顺序很重要)
  6. 正常:导入+调用匹配的视图
  7. 异常:调用错误处理视图(自定义可参考[路由实例])

2. 示例

2.1. 根路由(项目路由)

  1. # project/urls.py
  2. from django.urls import path, include
  3. urlpatterns = [
  4. path('community/', include('example.urls')), # 路由转发到应用
  5. path('<username>/blog/', include('foo.urls.blog')), # 捕获变量也会一并转发
  6. ]

2.2. 应用路由

  1. # app/urls.py
  2. from django.urls import path
  3. from . import views
  4. app_name = 'example' # 命名空间
  5. urlpatterns = [
  6. path('articles/2003/', views.special_case_2003, name='special'), # name 用于反向解析
  7. path('articles/<int:year>/', views.year_archive),
  8. path('articles/<int:year>/<int:month>/', views.month_archive),
  9. path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
  10. ]
  11. # 比如 `/articles/2003/03/building-a-django-site/` 将匹配最后一个,并调用
  12. views.article_detail(request, year=2003, month=3, slug="building-a-django-site")

注意

  1. <> 捕获URL中的一段传给视图函数
    a. <question_text> 默认,字符串
    b. <int:year> 转换为 int 叫做路径转换器
  2. path() 写路径时不用加前面的/
  3. /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字符串