Django 5.0.1中DRF API浏览器登出报HTTP ERROR 405的解决办法
Django 5.0.1 + DRF 登出报405错误的解决方案
问题原因
Django从4.0版本开始,官方的LogoutView就默认禁用了GET请求(目的是防范CSRF攻击),到5.0版本更是彻底移除了对GET请求的支持。而DRF的可浏览API(Browsable API)默认会用GET请求访问登出接口,这就导致了405 Method Not Allowed错误。Django 3.2版本的LogoutView还支持GET请求,所以之前能正常运行。
具体解决方案
方案1:自定义登出视图兼容GET请求(快速临时解决)
如果需要保持原有GET请求的习惯,可以自定义一个继承自LogoutView的视图,手动处理GET请求:
# views.py from django.contrib.auth.views import LogoutView class CustomLogoutView(LogoutView): def get(self, request, *args, **kwargs): # 将GET请求转为POST处理 return self.post(request, *args, **kwargs)
然后在路由配置里替换原有的登出路由:
# urls.py from django.urls import path from .views import CustomLogoutView urlpatterns = [ # 替换原logout路由 path('logout/', CustomLogoutView.as_view(), name='logout'), # 其他路由... ]
方案2:用DRF风格的APIView实现登出(推荐)
更符合DRF的设计规范,同时让可浏览API自动生成POST表单:
# views.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from django.contrib.auth import logout class LogoutAPIView(APIView): def post(self, request): logout(request) return Response({"detail": "登出成功"}, status=status.HTTP_200_OK)
更新路由配置:
# urls.py from django.urls import path from .views import LogoutAPIView urlpatterns = [ path('logout/', LogoutAPIView.as_view(), name='logout'), # 其他路由... ]
此时DRF的可浏览API会显示POST提交表单,用户提交后就能正常登出,不会触发405错误。
方案3:手动切换请求方法(无需修改代码)
如果不想改动代码,在DRF的可浏览API页面中,将请求方法从GET切换为POST,然后点击提交即可。DRF的可浏览API会自动带上CSRF令牌,满足Django的CSRF验证要求。
内容的提问来源于stack exchange,提问作者Swift Info
相关产品推荐
相关产品推荐

