1. 最基本路由关系
路由是URL地址与处理逻辑(视图函数)的对应关系。
本质:将用户请求的URL路径映射到具体的处理程序(如Django视图函数)。
示例:
# urls.py
urlpatterns = [
path('home/', views.home_view), # URL路径"home/" → home_view函数
]
当用户访问http://域名/home/时,自动触发home_view函数处理请求。
2. 动态路由(含正则)
动态路由通过URL参数传递数据,支持正则表达式灵活匹配路径
参数捕获:
# 捕获数字参数
path('user/<int:user_id>/', views.user_detail),
# 正则匹配(复杂场景)
re_path(r'users(\w+)/', views.users)
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_year),
访问/user/123/时,user_id=123传递给视图函数。
正则表达式作用:
约束参数格式(如限定4位年份)
精细化路径匹配规则
3. 路由分发到不同App
大型项目需拆分路由到多个App,通过include实现模块化管理
操作步骤:
(1)主路由配置(项目层)
# 主urls.py
urlpatterns = [
path('blog/', include('blog.urls')), # 子路由:blog App
path('shop/', include('shop.urls')), # 子路由:shop App
]
(2)子路由配置(App层)
# blog/urls.py
urlpatterns = [
path('list/', views.blog_list),
]
①访问/blog/list/时,由blogApp的blog_list视图处理
②核心优势
- 解耦项目结构
- 便于团队协作维护
4. Name与Namespace
解决多App路由命名冲突问题,支持反向解析URL
(1)Name(名称)
为路由定义唯一别名,反向生成URL:
# 定义
path('about/', views.about, name='about_page'),
# 一般会有以下两处会用到
# 1.模板中反向生成url (.html文件中)
<a href="{% url 'about_page' %}">关于我们</a>
# 2.在视图函数中生成URL
from django.urls import reverse
url = reverse("about_page")
(2)Namespace(命名空间)
区分不同App的同名路由:
from django.urls import path, re_path, include
# 主路由
urlpatterns = [
path('api/', include("apps.api.urls",namespace='a1')),
path('web/', include("apps.web.urls",namespace='w1')),
]
from django.urls import path, re_path
from . import views
# 子路由:api/urls.py
urlpatterns = [
path('login/', views.login,name="login"),
path('auth/', views.auth, name='auth'),
]
from django.urls import path, re_path
from . import views
# 子路由:web/urls.py
urlpatterns = [
path('home/', views.home,name='home'),
path('order/', views.order,name='order'),
path('auth/', views.order, name='auth'),
]
# 在某个URL或者视图中反向生成:
from django.urls import reverse
url = reverse("a1:login")
url = reverse("w1:home")
url = reverse("a1:auth")
url = reverse("w1:auth")
- 避免多个App中article_detail名称冲突
- namespace需要设置app_name:
# 主路由
urlpatterns = [
path('api/', include("apps.api.urls", namespace='a1')),
]
from django.urls import path, re_path
from apps.api import views
# 子路由:api/urls.py
urlpatterns = [
path('login/', views.login, name="login"),
path('auth/', views.auth, name='auth'),
]
app_name = "api"
5.总结对比
概念 | 作用 | 典型场景 |
基本路由关系 | URL → 视图映射 | 简单页面跳转 |
动态路由(正则) | 参数传递与格式约束 | 用户详情页、分类过滤 |
路由分发(include) | 模块化管理多App路由 | 大型项目分层开发 |
Name与Namespace | 反向解析URL + 避免命名冲突 | 多App协作、模板链接生成 |
路由系统通过路径匹配与参数处理,实现Web请求的精准分发与管理