Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/

输入 http://127.0.0.1:8000/main/index

路由定义情况

python 复制代码
urlpatterns = [
    path("index/", views.index)
]

可以发现我在输入URL的index路由时,如果没有和Django定义的路由匹配规则一样的话,浏览器自动给我们加上了这一层根斜杠,然后发起了两个请求。也就是http://127.0.0.1:8000/main/index会请求一次,然后末尾加斜杠转成http://127.0.0.1:8000/main/index/

这很显然就不是浏览器做的。

原因:

通过查阅Django官方文档可以发现通用中间件 CommonMiddleware做了这个处理。因为带斜杠和不带确实是两个不同的URL,Django为了统一标准URL,会自动补全,其实也就是做了一次310状态的重定向

  • 官方解释
  • 关键参数

我们可以在settings中将APPEND_SLASH = False

这样将关闭附加斜杠,将会严格匹配URL,你的路由匹配规则有斜杠,你发请求就必须有,没有斜杠,你发请求的时候也必须没有,就不会给你自动处理这个重定向。

实测效果:

路由映射规则有斜杠,但是请求时候没有就不行

去掉斜杠,再次访问就行了

PS:最好用访客or无痕测试,改完settings记得重新Run

总结:

从技术层面来说,带不带斜杠其实是不同的地址,也能访问到不同的资源。但是从用户体验层面而谈,如果你让用户访问admin路由,他必然不会访问admin/,这是习惯而言,谁没事加个斜杠。所以正常来说以不带斜杠为正常情况,如果用户加了/再进行重定向将会是一个更适合用户思维的设计。但是django并不是,django的做法如上所示,你没有斜杠就会去匹配,匹配不到就会加斜杠,加斜杠匹配不到就404。

django给的建议是,你最好将URL规范化!

但是go和Java的一些框架机制似乎是更符合用户思维,有需要的话其实也可以自己改django的通用中间件。也方便

相关推荐
databook26 分钟前
用方差阈值过滤掉“惰性特征”
python·机器学习·scikit-learn
Freak嵌入式27 分钟前
MCU 低功耗模式解析:时钟门控、电源门控、深度休眠
人工智能·python·单片机·嵌入式硬件·开源·依赖倒置原则·micropython
weixin_BYSJ19872 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
用户8356290780512 小时前
使用 Python 在 PDF 中绘制线条、矩形和自定义图形
后端·python
wang_yb2 小时前
用方差阈值过滤掉“惰性特征”
python·ai·databook
RFID固定资产管理系统4 小时前
公司RFID管理系统揭秘
大数据·python
IVEN_4 小时前
Python官方包、Conda、uv,应该怎么选
python
凡尘——雨落凡尘5 小时前
Python列表索引越界IndexError问题深度解析与解决办法
python·indexerror·list index out of range
Metaphor6925 小时前
使用 Python 在 Word 文档中添加或删除文本框
python·word
郝同学今天有进步吗6 小时前
构建 LangGraph Code Review Agent(七):实现规则匹配、Finding Guardrails 与 Markdown 报告
python·ai·fastapi·code review