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

Django logout视图失效 无网络流量 返回200但未成功登出

问题原因

你遇到的接口返回200但实际未登出、无对应网络流量的问题,由三个直接问题导致:

  • 前端JS存在语法错误:script标签未闭合,且设置CSRF请求头时把变量写成了固定字符串,JS执行直接中断,登出请求根本没有发送,对应浏览器看不到有效网络流量。
  • 跨域请求未配置携带凭证:你通过独立本地HTML文件发请求,和Django服务属于跨域场景,XHR默认不会携带存储登录态的sessionid和csrftokencookie,就算请求发出去,后端拿不到会话信息,logout()方法相当于空执行,不会清除登录状态。
  • 后端未配置跨域凭证放行规则,跨域带cookie的请求会被浏览器直接拦截。
修复方案

1. 修正前端HTML的JS逻辑

把原来的logout脚本替换为以下代码,注意修正变量传值、添加跨域凭证配置、补全语法闭合:

<button onclick="logout()">Log out</button>
<script>
function logout() {
  // 兼容cookie键值前后带空格的情况
  const csrfCookieRow = document.cookie.split(";").find(row => row.trim().startsWith("csrftoken="));
  if (!csrfCookieRow) {
    alert("未检测到登录状态,请先登录");
    return;
  }
  const csrfToken = csrfCookieRow.trim().split("=")[1];
  const xhr = new XMLHttpRequest();
  xhr.open("POST", "http://127.0.0.1:8000/members/logout_user/");
  xhr.withCredentials = true; // 关键:跨域请求携带cookie凭证
  xhr.setRequestHeader("X-CSRFToken", csrfToken); // 直接传变量,不要加引号
  xhr.onload = () => {
    if (xhr.status === 200) {
      alert("已成功登出");
    }
  };
  xhr.send();
}
</script>

2. 配置Django后端跨域规则

先安装跨域处理依赖:

pip install django-cors-headers

修改项目settings.py配置:

INSTALLED_APPS = [
    # 原有配置不变
    "corsheaders",
]

MIDDLEWARE = [
    # 把cors中间件放在最顶部,优先于其他中间件执行
    "corsheaders.middleware.CorsMiddleware",
    # 原有中间件配置不变,注意不要删Django自带的SessionMiddleware、AuthenticationMiddleware
]

# 测试阶段可开放跨域权限,生产环境替换为实际前端域名
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
# 信任跨域来源的CSRF请求
CSRF_TRUSTED_ORIGINS = ["http://127.0.0.1:8000"]

3. 验证步骤

  • 先清除浏览器中127.0.0.1:8000域名下的所有历史cookie,避免旧缓存干扰
  • 重新走登录流程,提交登录表单
  • 点击登出按钮,在浏览器网络面板可以看到logout请求正常发出,请求头携带Cookie和X-CSRFToken字段
  • 登出后访问admin站点,会自动跳转到登录页,不再保留登录状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:51:25