DRF中使用GET请求访问删除接口出现405 Method Not Allowed错误的原因及解决办法
DRF中使用GET请求访问删除接口出现405 Method Not Allowed错误的原因及解决办法
嘿,我一眼就看出问题在哪了!你遇到的这个405错误,核心原因就是你用错了请求方法,下面给你掰扯清楚:
为什么会报错?
- DRF的
DestroyAPIView默认规则:这个视图类本身就只允许DELETE和OPTIONS请求,这是它的内置限制——毕竟按照RESTful的设计规范,删除资源就该用DELETE方法,GET是用来获取资源的,两者语义完全不同。哪怕你自己重写了delete方法,它的父类已经把允许的请求方法锁死了,GET请求根本进不来。 - 浏览器直接访问的本质:你在Django Rest Web Browser里直接输入URL回车,这本质是发送了一个GET请求,而你的接口只认DELETE,所以服务器直接返回405告诉你“这个方法我不认”。
怎么解决?
根据你的需求,给你两个方向的方案:
方案一:用正确的请求方法测试(推荐,符合规范)
- 如果你用DRF自带的API调试界面:找到这个删除接口的页面后,看页面右上角的请求方法下拉框,把它从
GET改成DELETE,然后点击提交按钮就行。注意要先确保你已经登录了(因为你设置了permission_classes = [IsAuthenticated]),不然会先跳转到登录页面。 - 如果你用命令行或者调试工具:比如用
curl命令发送DELETE请求,示例如下(记得替换成你的实际域名,还要带上认证信息,比如token):
或者用Postman这类可视化工具,选择DELETE方法,输入URL,加上必要的认证头,再发送请求就行。curl -X DELETE -H "Authorization: Token your-auth-token" http://localhost:8000/classroom/delete/1/
方案二:强行让接口支持GET请求(不推荐,仅作应急参考)
如果你非要用GET请求来触发删除逻辑(真的不建议这么做,会破坏接口语义),可以这么改你的视图类:
class ClassroomDeleteViewAPI(generics.DestroyAPIView): serializer_class = ClassroomSerializer permission_classes = [IsAuthenticated] # 新增允许GET请求 allowed_methods = ['DELETE', 'GET', 'OPTIONS'] def get_queryset(self): return Classroom.objects.filter(teacher_assigned=self.request.user) def delete(self, request, pk): try: classroom = Classroom.objects.get(pk=pk) classroom.delete() return Response(status=status.HTTP_204_NO_CONTENT) except Classroom.DoesNotExist: return Response({ 'detail': 'Classroom not found' }, status=status.HTTP_404_NOT_FOUND) # 新增get方法,复用delete的逻辑 def get(self, request, pk): return self.delete(request, pk)
但再次强调,这种做法违背了RESTful的设计原则,会让你的接口语义混乱,后续维护起来容易踩坑,能不用就不用。
另外,你的视图代码和URL配置都是没问题的,就是请求方法用错了,换对方法就正常了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

