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

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服务,重新操作:

  1. 点击登录按钮,确认登录成功。
  2. 点击check user,应该返回你的用户名而非anonymous。
  3. 点击test access,应该返回ok而非403或404。

如果仍有问题,可以通过浏览器开发者工具排查:

  • 在Application标签下查看10.0.0.9域名下是否存在sessionid Cookie。
  • 在Network标签下查看后续请求的Request Headers,确认包含Cookie: sessionid=xxx字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:56:05