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的通用中间件。也方便

相关推荐
田里的水稻5 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
jiayong236 小时前
02 创建虚拟环境
python
旺仔来了6 小时前
不联网的Linux下部署python环境
linux·开发语言·python
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
IP搭子来一个6 小时前
爬虫采集大量返回 403、429,到底卡在哪一环?
网络·爬虫·python
deepin_sir7 小时前
06 综合对比与实战选型——到底该用哪个?
python
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试
智研数智工坊7 小时前
FastAPI+uv+Jinja2+Nuitka 通用Web桌面框架搭建教程|从零搭建可打包迭代的Python开发底座
python·fastapi·uv·nuitka·jinja2·桌面应用开发
Ulyanov8 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
❀搜不到8 小时前
Ubuntu查看指定Python程序的CPU、GPU、内存占用情况
linux·python·ubuntu