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

