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

Django登出模板失效,POST请求仍报405错误如何解决?

问题分析与解决步骤

你的代码存在几处关键错误,导致出现405(不允许GET请求)的问题,以下是具体修复方案:

1. 修正模板表单的目标地址

你的logged_out.html里表单的action指向了登录接口,而非登出接口,这是核心错误:

{% extends 'base.html' %}

{% block title %}
    Logout
{% endblock %}

{% block content %}
<form action="{% url 'logout' %}" method="POST">
    {% csrf_token %}
    <button type="submit">Logout</button>
</form>
{% endblock %}

2. 清理路由配置冲突

你同时配置了Django自带的auth路由和自定义的登出路由,且自定义视图未关联到路由,导致生效的是auth_views.LogoutView,但未正确限制请求方法。以下提供两种修复方案:

方案一:使用Django自带LogoutView并强制POST

修改urls.py,移除重复路由并给LogoutView设置仅接受POST:

from django.contrib.auth import views as auth_views

urlpatterns = [
    # 若不需要Django自带的全套auth路由,可删除此行避免冲突
    # path('accounts/', include("django.contrib.auth.urls")),
    path('accounts/logout/', auth_views.LogoutView.as_view(
        template_name='logged_out.html',
        http_method_names=['post']  # 强制仅接受POST请求
    ), name='logout'),
]

方案二:使用自定义的user_logout视图

修改urls.py,替换为自定义视图的路由:

from django.urls import path
from . import views

urlpatterns = [
    # 删除或注释掉自带auth路由和LogoutView路由
    # path('accounts/', include("django.contrib.auth.urls")),
    # path('accounts/logout/', auth_views.LogoutView.as_view(template_name='logged_out.html'), name='logout'),
    path('accounts/logout/', views.user_logout, name='logout'),
]

3. 注意事项

  • 禁止直接在浏览器地址栏访问/accounts/logout/(这是GET请求),必须通过表单POST提交。
  • 若页面中有导航栏登出链接,不能用<a href="{% url 'logout' %}">(GET请求),需改为表单或用JS发起POST请求。
  • 确保表单中包含{% csrf_token %},否则会触发CSRF验证错误。

内容的提问来源于stack exchange,提问作者Raul kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:52:12