为什么JavaScript的fetch方法在请求URL中添加多余斜杠(搭配Django使用)
问题原因
该现象是Django框架默认配置导致的:Django 默认开启 APPEND_SLASH 配置项,当收到的请求路径末尾没有斜杠、且和项目 urls.py 中定义的所有路由规则都不匹配时,会自动返回301重定向响应,自动在路径末尾添加斜杠后跳转,你看到的多余斜杠就是重定向后生成的路径。
解决方案
- 方案1:前端请求路径主动加尾部斜杠(最推荐,符合Django默认路由规范)
直接修改前端拼接URL的逻辑,给基础路径加上尾部斜杠即可,同时建议用URLSearchParams拼接参数避免特殊字符转义问题,代码示例:let url = `ajax_vehical_types/`; const params = new URLSearchParams(); groups.forEach((x, i) => { params.append(`group[${i}]`, x); }); if (params.toString()) { url += `?${params.toString()}`; } const vehical_type = await fetch(`${window.location.origin}/${url}`) .then((res) => res.json()) .then((data) => data); - 方案2:修改Django路由规则去掉尾部斜杠
找到urls.py中对应接口的路由定义,删除路径末尾的斜杠即可:# 修改前 # path('ajax_vehical_types/', views.vehical_type_view, name='vehical_type'), # 修改后 path('ajax_vehical_types', views.vehical_type_view, name='vehical_type'), - 方案3:关闭Django自动补全斜杠配置(不推荐)
在项目settings.py中添加如下配置,全局关闭自动补斜杠逻辑,修改后所有路由都需要和请求路径完全匹配才会响应:APPEND_SLASH = False
注意事项
- 301重定向会被浏览器长期缓存,修改配置后需要清空浏览器缓存或者使用无痕模式测试,避免旧的重定向规则残留影响验证结果。
- 原代码中使用
map遍历仅做参数拼接属于不合理用法,map设计用途是生成新数组,纯遍历副作用请使用forEach。
内容的提问来源于stack exchange,提问作者Vignesh N U
相关产品推荐
相关产品推荐

