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

相关推荐
二宝哥11 小时前
15.Python第三方库安装全攻略:全局环境 vs 虚拟环境、镜像配置详解
python
梅雅达编程笔记18 小时前
零基础学 Python 第14章 | 模块、包与第三方库
开发语言·python·django·numpy·pandas
Mr__Miss19 小时前
Java泛型完全指南:从入门到精通
java·开发语言·python
嘿丨嘿19 小时前
VLA 入门(六):VLA 如何进行强化学习后训练?
人工智能·python·深度学习·机器人
祉猷并茂,雯华若锦20 小时前
Appium 3.x实战:获取元素属性全解析
python·appium·自动化
宠友信息20 小时前
消息序号如何保证即时通讯源码聊天记录稳定加载
java·spring boot·redis·python·mysql·uni-app
小柯南敲键盘21 小时前
批量图片翻译与视频字幕一站式解决高效跨境电商沟通难题
大数据·人工智能·python·音视频
梅雅达编程笔记21 小时前
零基础学 Python 第15章 | 类与对象:面向对象编程入门
开发语言·python·django·numpy·pandas
smj2302_796826521 天前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
吴梓穆1 天前
Python 基础 正则表达式
python