为何调用DELETE方法却返回‘Method "GET" not allowed’错误?
请求DELETE接口却收到"Method 'GET' not allowed"错误的原因排查
下面是几种最可能的原因和对应的解决办法:
实际发送的是GET请求
别光看自己选了DELETE,先确认请求真的是DELETE方法:- 浏览器直接输URL访问的话,默认就是GET请求,肯定会被拒绝,必须用Postman、curl这类工具发DELETE请求
- 检查前端代码或者请求工具的配置,是不是不小心把Method选成了GET,比如Postman里下拉框是不是真的选了DELETE
URL末尾缺斜杠导致重定向成GET
你的URL配置里是delete/user/<str:username>/(末尾带斜杠),如果请求的URL没带斜杠(比如http://xxx/delete/user/test),Django会自动做301重定向到带斜杠的地址,而重定向后的请求方法会变成GET,自然触发错误。
解决:要么确保请求URL末尾带上斜杠,要么在Django的settings.py里把APPEND_SLASH设为False(不推荐,可能影响其他接口的路由匹配)CSRF验证引发的间接问题(仅针对session认证场景)
如果你的接口依赖Django的session认证(比如登录后用浏览器请求),DRF的APIView会强制检查CSRF Token。如果请求里没带正确的CSRF Token,有些情况下前端会自动把请求改成GET重试,就会出现这个错误。
解决:如果是前后端分离的纯API接口,建议改用Token或JWT认证,关闭CSRF验证;如果必须用session认证,要在请求头里带上X-CSRFToken,值从浏览器的cookie中获取。
另外给个小建议:你的视图里用filter删除用户,如果用户不存在的话不会抛异常,会默默执行delete但没效果,改成get能更精准处理用户不存在的情况:
def delete(self, request, username): try: instance = User.objects.get(username=username) instance.delete() return HttpResponse("Success") except User.DoesNotExist: return Response({'error': '用户不存在'}, status=status.HTTP_404_NOT_FOUND) except Exception as e: return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
内容的提问来源于stack exchange,提问作者Quý Nguyễn Hoàng
相关产品推荐
相关产品推荐

