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

Django中AJAX GET请求始终获取到AnonymousUser的问题求助

Django AJAX GET请求无法获取登录用户(AnonymousUser)问题排查与解决

以下是针对你遇到问题的具体排查方向和解决方案:

一、跨域凭证配置缺失

如果前端与后端属于跨域场景(域名/端口不同),仅在AJAX中设置withCredentials: true不足以让Django识别用户会话,必须在后端配置允许跨域携带凭证:

  1. 若使用django-cors-headers库,在settings.py中添加:
CORS_ALLOW_CREDENTIALS = True
# 必须指定允许的前端域名,不能用通配符*
CORS_ALLOWED_ORIGINS = [
    "https://your-frontend-domain.com",
]
  1. 若手动处理跨域响应头,需在视图或中间件中添加:
response["Access-Control-Allow-Credentials"] = "true"
response["Access-Control-Allow-Origin"] = "https://your-frontend-domain.com"

二、会话Cookie配置不兼容跨域

Django默认的会话Cookie配置可能无法适配跨域场景,需调整settings.py中的Cookie参数:

# 跨域HTTPS场景可设为"None",但必须同时开启SESSION_COOKIE_SECURE
SESSION_COOKIE_SAMESITE = "Lax"
# 仅在HTTPS环境下开启,确保Cookie通过安全通道传输
SESSION_COOKIE_SECURE = True
# 前后端同主域不同子域时,设置为主域(如".example.com")
SESSION_COOKIE_DOMAIN = ".your-domain.com"

注意:若设置SESSION_COOKIE_SAMESITE="None",必须配合SESSION_COOKIE_SECURE=True,否则浏览器会拒绝保存Cookie。

三、自定义用户模型未全局指定

你已定义自定义User模型,但必须在settings.py中明确声明,否则Django仍会使用默认的auth.User,导致会话验证失败:

# 替换为你的app名称(如"accounts.User")
AUTH_USER_MODEL = "your_app_name.User"

同时确保已执行数据库迁移,生成对应的用户表。

四、@login_required装饰器的隐藏问题

虽然添加了@login_required装饰器,但如果AJAX请求未携带有效会话,装饰器会自动重定向到登录页,而AJAX默认不会处理重定向,可能导致你看到的响应实际是登录页内容,而非视图中返回的AnonymousUser。可以先临时注释装饰器,直接访问视图,确认是否能获取到用户,再排查重定向逻辑。

另外,检查登录视图是否正确调用auth.login(request, user)完成会话设置,确保登录后浏览器能接收到会话Cookie。

五、认证后端配置异常

继承AbstractUser的自定义用户模型默认可使用Django的ModelBackend,但如果有自定义认证逻辑,需确保settings.py中配置正确:

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
    # 如有自定义认证后端,添加在此处
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:31:08