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

重定向后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 migrate
    
    该命令会创建django_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:41