Django带尾部斜杠的URL调用时报404 Not Found错误是什么原因?
问题诱因
- 核心和Django的
APPEND_SLASH全局配置、路由匹配规则、POST请求的重定向特性相关:APPEND_SLASH是Django的默认全局配置,默认值为True,逻辑为:当请求的URL无尾部斜杠且未匹配到任何路由时,自动返回301重定向到加了尾部斜杠的同路径。但该逻辑仅对GET、HEAD等幂等请求生效,POST请求触发该重定向时会被转为GET请求、丢失请求体,若视图仅支持POST方法,会直接返回404/405错误。- 若已手动在
settings.py中设置APPEND_SLASH = False,Django会严格匹配URL的尾部斜杠,无自动补全/去除的兼容逻辑,只要请求路径和配置路由的尾部斜杠不一致就会返回404。 - 嵌套路由配置冲突也会触发该问题:如果用
include加载子路由时,父路由已经配置了quiz/前缀,子路由再次以quiz/开头会导致最终注册的路由路径为/quiz/quiz/timeupdate/,和请求的/quiz/timeupdate/不匹配,若同时配置了无斜杠的同路径路由刚好能被匹配,就会出现仅去掉斜杠时请求正常的情况。
解决方案
方案1:遵循Django默认规范(推荐)
- 确认
settings.py中没有手动修改APPEND_SLASH配置,保留默认True的取值 - 所有路由配置统一添加尾部斜杠,POST/PUT/DELETE等非幂等请求的前端调用地址和路由配置完全对齐,统一携带尾部斜杠,避免触发重定向丢失请求体
方案2:统一使用无斜杠路由
- 如果团队规范要求URL不带尾部斜杠,在
settings.py中显式添加配置APPEND_SLASH = False - 所有路由配置统一去掉尾部斜杠,前端所有请求地址也和路由配置完全对齐,不携带尾部斜杠
临时兼容方案
如果需要同时支持带斜杠和不带斜杠的请求,可以用正则路由匹配尾部斜杠可选:
from django.urls import re_path re_path(r'^quiz/timeupdate/?$', updateTime.as_view(), name='timeupdates')
内容的提问来源于stack exchange,提问作者Divit Rao
相关产品推荐
相关产品推荐

