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

线上Django Rest Framework API返回403错误及会话损坏排查求助

解决会话数据损坏导致DRF认证失败的问题

1. 排查并清理异常会话数据

  • 若使用数据库存储会话,进入数据库执行以下操作:
    -- 从浏览器Cookie中获取sessionid,替换为实际值查询会话数据
    SELECT * FROM django_session WHERE session_key = '你的会话sessionid';
    -- 确认数据异常后删除该会话记录
    DELETE FROM django_session WHERE session_key = '你的会话sessionid';
    
  • 若使用缓存存储(如Redis),针对性清理会话缓存:
    # 仅删除Django会话相关缓存键(避免误删其他业务数据)
    redis-cli KEYS "django.contrib.sessions.cache*" | xargs redis-cli DEL
    

2. 确保SECRET_KEY环境一致性

线上与本地的SECRET_KEY必须完全一致——Django依赖该密钥签名会话数据,密钥不匹配会直接导致会话验证失败,触发“Session data corrupted”提示。检查线上settings.py,确认SECRET_KEY值与本地开发环境完全相同。

3. 修正Cookie与Ajax请求配置

线上环境中,Cookie属性或Ajax请求设置不当会导致会话无法正常传递:

  • 调整settings.py中的Cookie配置:
    SESSION_COOKIE_SECURE = True  # HTTPS环境必须开启,确保Cookie仅通过加密传输
    CSRF_TRUSTED_ORIGINS = ['https://你的线上域名']  # 添加域名,避免跨域CSRF验证失败
    SESSION_COOKIE_HTTPONLY = False  # 若前端需通过JS读取会话ID则设为False,否则保持True
    
  • 前端Ajax请求需开启携带Cookie(以axios为例):
    axios.get('/api/目标接口/', { withCredentials: true })
    

4. 彻底重启Gunicorn进程

仅重启服务器可能残留旧Gunicorn进程,导致会话数据无法刷新:

# 强制停止并重启Gunicorn
sudo systemctl stop gunicorn
sudo systemctl start gunicorn
# 验证进程是否完全更新
ps aux | grep gunicorn

5. 检查中间件顺序

settings.py中会话相关中间件必须按正确顺序排列:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',  # 需在认证中间件之前
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 其他中间件...
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:40:53