输入 http://127.0.0.1:8000/main/index/
输入 http://127.0.0.1:8000/main/index
路由定义情况
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的通用中间件。也方便