重定向后Django Session值无法持久化的问题求助
解决DRF跨视图Session读取失败问题
以下是针对你遇到的Session存储后无法跨视图读取问题的排查和解决步骤:
1. 处理跨域场景下的Cookie传递
你在FunctionOne中重定向到前端http://localhost:3000,若前后端端口不同(比如后端用8000),属于跨域请求,默认不会携带Django的Session Cookie,导致读取失败:
- 安装并配置
django-cors-headers:# settings.py INSTALLED_APPS = [ # 其他已存在的应用 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 需放在CommonMiddleware之前 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 其他中间件 ] CORS_ALLOW_CREDENTIALS = True CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", ] - 前端请求
FunctionTwo时,需开启带凭证模式:
以axios为例:axios.get('/api/function-two', { withCredentials: true })
2. 确认Session表已创建
使用PostgreSQL作为数据库时,需确保Django的Session表已生成:
- 执行数据库迁移命令:
该命令会创建python manage.py migratedjango_session表,用于持久化Session数据。若未执行迁移,Session数据无法存入数据库,自然无法跨视图读取。
3. 检查SessionMiddleware的中间件顺序
确保SessionMiddleware在中间件列表中的位置正确,需放在AuthenticationMiddleware之前,且在CsrfViewMiddleware之前:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 其他中间件 ]
4. 强制Session保存
虽然你已设置request.session.modified = True,可尝试手动调用save()方法确保Session数据写入数据库:
class FunctionOne(GenericAPIView): permission_classes = (permissions.AllowAny,) authentication_classes = [] def get(self, request, *args, **kwargs): request.session["kcc"] = request.GET.get("code") request.session.save() # 强制保存Session print("kcc", request.session.get("kcc", None)) return redirect("http://localhost:3000/checkout")
5. 手动验证Session数据
直接查询PostgreSQL中的django_session表,确认Session数据是否已存储:
SELECT * FROM django_session;
也可通过Django Shell解码Session数据验证:
from django.contrib.sessions.models import Session # 替换为实际的session_key,可从request.session.session_key获取 session = Session.objects.get(session_key='your_session_key') print(session.get_decoded()) # 查看解码后的Session内容,确认是否包含"kcc"键
内容的提问来源于stack exchange,提问作者savel
相关产品推荐
相关产品推荐

