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
相关产品推荐
相关产品推荐

