django框架之路由分发
创始人
2025-05-28 14:38:16
0

0.路由系统

本质上:URL和函数的对应关系。

1.传统的路由

示例:包含一个apps,内含两个app device和asserts
路由分发方式为通过主路由找分app的路由,在app的路由内找本app的views
主路由urls

from django.urls import path,includeurlpatterns = [path('device/',include("apps.device.urls")),path('asserts/',include("apps.asserts.urls")),# 注意不要在device前加/,那样就出问题了
]

device 的urls
需要在文件内定义app_name

from django.urls import path,re_path
from apps.device import viewsurlpatterns = [path('home/',views.home),path('web/',views.web),
]
app_name="device"

device内的views

from django.shortcuts import render,HttpResponse
def home(request):return HttpResponse("home page")def web(request):return HttpResponse("web page")

这里不用定义app_name

2. 路由分发

假如:200个功能。

inlucde + app(一般),将功能拆分不到不同的app中。 但是要定义每一个app的app_name到urls内

手动路由分发,可以与app无关。 可以不定义app_name

path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),path('user/', ([path('add/', views.login),path('delete/', views.login),   # /user/delete/path('edit/', views.login),path('list/', views.login),], None, None)),纯粹帮助提取功能的URL,防止重复编写。

路由分发的本质:

  • URL对应函数

    path('user/add/', views.login),
    
  • URL对应元组

    path('user/add/',    (元素,appname元素,namespance元素)    ),
    
    path('user/add/',    include("apps.api.urls")    ),  # 查看include 也是元组
    path('user/add/',     ([],None,None)     ),
    

小结

  • include或手动元组列表,本质相同。

  • 应用场景和意义,想要把一些URL前缀提取出来。

    path('user/add/', views.login),
    path('user/delete/', views.login),
    path('user/edit/', views.login),
    path('user/list/', views.login),path('user/', ([path('add/', views.login),path('delete/', views.login),   # /user/delete/path('edit/', views.login),path('list/', views.login),], None, None)),path('users', include(([path('add/', views.login),path('delete/', views.login),  # /user/delete/path('edit/', views.login),path('list/', views.login),], None))),include("apps.api.urls")  # 一般是每个app中urls
    urlpatterns = []
    

3. name

name是可以用于单APP的情况,如果是多APP的话,需要为每个app添加单独的namespace
给一个路由起个名字 + 根据名字反向生成URL。

urlpatterns = [path('login/', views.login),
]
# 很多功能,很多URL
urlpatterns = [path('login/', views.login, name="v1"),path('auth/', views.auth, name="v2"),
]

有了名字后,以后一般有两处会用到:

  • 在视图函数中生成URL

    from django.urls import reverse
    url = reverse("v2")   # /auth/
    url = reverse("v1")   # /login/
    
  • HTML模板,页面上有一个a标签,添加xx。

    添加
    
    添加
    添加
    
  • 扩展

    以后做权限管理,让name属性配合。
    

4. namespace

辅助name。

  • 主路由 主路由是namespace

    from django.urls import path, re_path, include# 很多功能,很多URL
    urlpatterns = [path('api/', include("apps.api.urls",namespace='x1')),path('web/', include("apps.web.urls",namespace='x2')),
    ]
    
  • api/urls.py

    from django.urls import path, re_path
    from . import views
    # 很多功能,很多URL
    urlpatterns = [path('login/', views.login,name="login"),path('auth/', views.auth, name='auth'),
    ]
    
  • web/urls.py

    from django.urls import path, re_path
    from . import views
    # 很多功能,很多URL
    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("x1:login")    # /api/login/
url = reverse("x1:order")    # /web/login/url = reverse("x1:auth")    # /api/login/
url = reverse("x2:auth")    # /web/login/

两个扩展:

  • namespace需要设置app_name

    urlpatterns = [path('api/', include("apps.api.urls", namespace='x1')),
    ]
    
    # 在指定APP的urls内定义appname
    from django.urls import path, re_path
    from apps.api import views# 很多功能,很多URL
    urlpatterns = [path('login/', views.login, name="login"),path('auth/', views.auth, name='auth'),
    ]app_name = "api"
    
  • 手动分发

手动分发 不会去 找namespace

赠送:

5. 最后的 / 如何解决?

在settings内设置

APPEND_SLASH = True

path('login/', views.login),http://127.0.0.1:8000/login/   成功http://127.0.0.1:8000/login    django,重定向301http://127.0.0.1:8000/login/   成功
path('login', views.login),http://127.0.0.1:8000/login    成功http://127.0.0.1:8000/login    http://127.0.0.1:8000/login/   失败

APPEND_SLASH = False

path('login/', views.login),http://127.0.0.1:8000/login/   成功http://127.0.0.1:8000/login    失败
path('login', views.login),http://127.0.0.1:8000/login/   失败http://127.0.0.1:8000/login    成功

小结

  • 常见 & 必须掌握

    • 传统路由
    • 路由分发
    • name
  • 差点意思

    • 正则
    • namapace
    • 当前对象
  • 补充小知识点(与django路由无关,看源码时有关)

    • 关于 partial

      def _xx(a1, a2):return a1 + a2data = _xx(11, 22)
      print(data)
      from functools import partialdef _xx(a1, a2):return a1 + a2yy = partial(_xx, a2=100)data = yy(2)
      print(data)
      

相关内容

热门资讯

黄金“不灵了”,高端金饰的溢价... 古法黄金到底能不能走出脱离金价波动的独立溢价 作者:赵心怡 2026年开年,国际金价一路狂飙至近56...
朗迅科技由董事长徐振控制46%... 瑞财经 刘治颖 6月24日,杭州朗迅科技股份有限公司(以下简称:朗迅科技)深主板IPO获受理,保荐机...
两部门:2030年可再生能源制... 【两部门:2030年可再生能源制氢规模达到200万吨】财联社6月25日电,国家发展改革委、国家能源局...
原创 警... 大家好,这里是全球脉冲。 6月16日,日本央行宣布加息25个基点,政策利率上调至1%,创下31年来最...
黄金钻石回收怎么选?上海市场常... 近年来黄金价格持续走高,不少上海市民都有变现家中闲置黄金首饰、投资金条的打算。但市面上回收门店数量众...
专访火山引擎谭待:模型好对Ma... 文 | 邓咏仪 编辑 | 张雨忻 火山引擎总裁谭待 来源:火山引擎 过去三年,火山引擎总裁谭待给团...
女董事长深夜被带走,牵出金融旧... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 大半夜的,一家上市公司董事...
盯盯拍报考港交所上市:出海翻红... 撰稿|贝多 来源|贝多商业&贝多财经 6月22日,盯盯拍(深圳)技术股份有限公司(下称“盯盯拍”)递...
苏州千亿市值上市公司+1! A股“苏州板块”又诞生了一家千亿市值企业。 昨日(6月25日),苏州上市公司永鼎股份股价在昨日涨停的...
芯片股猛拉!600667,一字... 【导读】创业板指一度涨超2%,存储芯片、半导体、电子元器件等方向涨幅居前 中国基金报记者 李智 一起...
分析师:海峡收费与否已不重要 ... 来源:格隆汇APP 格隆汇6月25日|阿曼方面重申,霍尔木兹海峡未来安排不涉及通行费。美国财经网站i...
《内外贸一体化企业评价通则》团... 齐鲁晚报·齐鲁壹点记者 管悦 6月25日,《内外贸一体化企业评价通则》团体标准审查会在济南召开。该标...
提升AI智能体工作流的速度与能... 智能体工作流是一种由AI驱动的软件系统,它通过串联多个模型与外部工具来处理复杂任务,例如分析视频并回...
热搜!又有纸尿裤被曝检出甲酰胺... 来源:市场资讯 (来源:北京商报) 网友:“囤了200多包”。 近日,多个婴幼儿纸尿裤品牌“被检出...
埃森哲内部录音曝光:企业AI使... IT之家 6 月 26 日消息,科技媒体 404Media 昨日(6 月 25 日)发布博文,披露了...
FIBA期待杨瀚森表现 最新实... 北京时间6月25日消息,FIBA国际篮联公布了最新一期世界杯预选赛亚太区球队实力榜,中国男篮排在澳大...
收评:创业板指放量反弹涨2.8... 市场冲高回落后,再度震荡拉升。黄白线分化明显,权重股走势较强。量能明显放大,沪深两市成交额3.59万...
巨头财报引爆A股存储芯片板块,... 当地时间6月24日美股盘后, 美光科技(MU.US)公布截至5月31日的2026财年第三财季财报,业...
银行、消金公司助贷余额增速不得... 近日,中国证券报记者从多位业内人士处独家获悉,5月以来,多地金融监管部门对部分中小银行、消金公司下达...