【Django】框架-路由系统核心概念解析

发布于:2025-04-18 ⋅ 阅读:(31) ⋅ 点赞:(0)

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/时,由blogAppblog_list视图处理

核心优势

  • 解耦项目结构
  • 便于团队协作维护

4. NameNamespace

解决多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")    
  • 避免多个Apparticle_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路由 大型项目分层开发
NameNamespace 反向解析URL + 避免命名冲突 App协作、模板链接生成

路由系统通过路径匹配与参数处理,实现Web请求的精准分发与管理


网站公告

今日签到

点亮在社区的每一天
去签到