You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:32:14