Django中DELETE请求被重定向至GET的问题咨询
解决Django + Tastypie中DELETE请求无斜杠被重定向为GET的问题
问题根源
Django的CommonMiddleware处理无斜杠请求时,默认返回301重定向,但只有在Django 3.1+配置APPEND_SLASH_REDIRECT_STATUS_CODE为307/308时,才会保留原始请求方法。再加上Postman默认跟随重定向时会把请求方法改成GET,叠加Tastypie对重定向请求的兼容问题,就出现了这个异常。
可行修复方案
1. 直接使用带斜杠的请求URL
最直接的解决方式:在Postman中将请求URL改为http://127.0.0.1:8000/api/v1/courses/3/,带斜杠的DELETE请求本来就能正常工作,直接采用这种格式即可。
2. 修改Django配置,让重定向保留请求方法
在settings.py中添加以下配置:
APPEND_SLASH_REDIRECT_STATUS_CODE = 307 # 临时重定向,强制保留原请求方法 # 也可选择308(永久重定向),根据业务需求决定
307/308是HTTP标准中专门用于保留请求方法的重定向状态码,Postman会遵循该规则,不会将DELETE请求改为GET。
3. 调整URL路由,兼容带/不带斜杠的请求
在API的路由配置文件中,为资源路由添加可选斜杠的匹配规则:
from django.urls import re_path from tastypie.api import Api from yourapp.api import CourseResource v1_api = Api(api_name='v1') v1_api.register(CourseResource()) urlpatterns = [ # 同时匹配带斜杠和不带斜杠的请求 re_path(r'^api/v1/courses/(?P<pk>\d+)/?$', v1_api.urls[0]), # 其他API资源路由按此格式修改 ]
这样无论请求URL带不带斜杠,都会直接命中对应的视图,彻底跳过重定向环节。
4. 检查Postman的重定向设置
打开Postman的请求设置(齿轮图标入口),找到Follow Redirects选项:
- 若采用了307/308配置,确保该选项开启,Postman会自动以原请求方法执行重定向
- 若不想修改配置,也可直接关闭该选项,自行处理原始请求的状态码
验证步骤
修改配置后重启Django服务,再次发送不带斜杠的DELETE请求,确认是否正常执行删除操作,不再被重定向为GET请求。
内容的提问来源于stack exchange,提问作者Andrey2909
相关产品推荐
相关产品推荐

