Django API登录后仍为AnonymousUser,受限接口无法访问求助
问题分析与解决方案
看起来你遇到的核心问题是跨域请求下Session Cookie没有被正确携带,导致Django无法识别已登录用户,始终返回AnonymousUser;同时testaccess返回404大概率是路由配置不匹配的问题。下面分步骤帮你解决:
一、先修复404错误
首先检查你的urls.py配置,确保testAccess函数对应的路由和前端请求的路径完全一致。示例配置如下:
# urls.py from django.urls import path from . import views urlpatterns = [ path('login/', views.dologin), path('logout/', views.dologout), path('testaccess/', views.testAccess), # 必须和前端请求的/testaccess/路径匹配 path('checkuser/', views.checkUser), ]
如果路由路径写错(比如写成test_access/或testAccess/),就会触发404响应。
二、解决跨域Session认证失效问题
你的前端页面和Django服务属于跨域环境(比如前端是本地file://协议,或不同端口),浏览器默认会阻止跨域请求携带Cookie,而Django的Session认证完全依赖SessionID Cookie,所以登录成功后,后续请求没有带上SessionID,服务器自然识别不出用户。
1. 前端修改:开启Ajax请求的凭证携带
在jQuery脚本中,需要显式开启withCredentials,让浏览器把登录时设置的SessionID Cookie发送给Django。推荐全局配置,一次修改所有请求:
// 在所有请求前添加全局配置 $.ajaxSetup({ xhrFields: { withCredentials: true // 允许跨域携带Cookie凭证 }, crossDomain: true }); // 原有的点击事件代码保持不变 $("#inbtn").click(function(){ u = $("#uin").val(); p = $("#pin").val(); d = {username: u, password: p}; $.post("http://10.0.0.9:8000/login/", d, function(data){ $("#res").html(data); }).fail(function(xhr, status, error){ $("#res").html(xhr.responseText + " - " + xhr.status); }); }); // 其他按钮的点击事件代码不变
2. 后端Django配置:允许跨域携带凭证
Django默认不允许跨域请求携带凭证,需要借助django-cors-headers库来配置:
第一步:安装依赖库
pip install django-cors-headers
第二步:修改settings.py配置
- 将
corsheaders添加到INSTALLED_APPS:
INSTALLED_APPS = [ # 原有其他app 'corsheaders', ]
- 添加中间件(注意顺序,必须放在
CommonMiddleware之前):
MIDDLEWARE = [ # 原有其他中间件 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 原有其他中间件 ]
- 添加跨域核心配置:
# 允许跨域请求携带凭证 CORS_ALLOW_CREDENTIALS = True # 允许的前端域名,替换成你实际的前端页面地址(比如本地服务器地址http://localhost:8080) # 如果是用file://打开的本地HTML文件,开发测试时可临时设置CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_WHITELIST = [ "http://localhost:8080", "http://127.0.0.1:8080", ] # 开发环境下关闭Cookie的Secure属性(否则HTTP协议下Cookie不会被发送) SESSION_COOKIE_SECURE = False
三、验证修复效果
修改完成后重启Django服务,重新操作:
- 点击登录按钮,确认登录成功。
- 点击
check user,应该返回你的用户名而非anonymous。 - 点击
test access,应该返回ok而非403或404。
如果仍有问题,可以通过浏览器开发者工具排查:
- 在
Application标签下查看10.0.0.9域名下是否存在sessionidCookie。 - 在
Network标签下查看后续请求的Request Headers,确认包含Cookie: sessionid=xxx字段。
内容的提问来源于stack exchange,提问作者DorBS
相关产品推荐
相关产品推荐

