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

如何在DRF的APIView中设置Session变量并跨视图访问

DRF APIView跨视图读写Session实现方案

首先明确:DRF的Request对象已经对Django原生请求的session属性做了透明代理,使用request.session['name'] = 'SRJ'的写法本身不存在语法问题,跨视图无法读取和DRF、原生请求的差异无关,按以下步骤排查配置即可实现需求。

1. 补齐基础Session配置

Session能力由Django框架层的中间件实现,和DRF本身无关,先确认settings.py配置正确:

  • INSTALLED_APPS中添加django.contrib.sessions
  • MIDDLEWARE列表中按顺序添加以下两个中间件,SessionMiddleware必须放在AuthenticationMiddleware之前:
    MIDDLEWARE = [
        # ...其他中间件
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        # ...其他中间件
    ]
    
  • 确认SESSION_ENGINE配置正常,默认使用数据库存储不需要额外修改,若配置了缓存/文件等存储引擎,确保对应存储服务可用。

2. 解决跨域场景Cookie不携带问题

前后端分离跨域部署是Session失效的最高发原因,Session依赖请求头中携带的sessionid Cookie关联用户会话,需要同时配置前后端:

  • 前端请求开启凭证携带:使用axios时配置withCredentials: true,使用原生fetch时配置credentials: 'include'
  • 后端CORS配置允许凭证:如果使用django-cors-headers,需设置CORS_ALLOW_CREDENTIALS = True,同时CORS_ALLOWED_ORIGINS不能配置为通配符*,必须填写明确的前端服务地址
  • 本地调试时不要开启SESSION_COOKIE_SECURE = True(该配置仅允许HTTPS环境传输Cookie,本地HTTP环境会导致Cookie丢失),SESSION_COOKIE_SAMESITE建议先设置为Lax调试,避免跨站Cookie拦截。

3. 正确的读写代码示例

写入Session的视图

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication

class SetSessionAPI(APIView):
    # 若全局未配置SessionAuthentication,可在单视图声明,不强制但可避免认证层拦截
    authentication_classes = [SessionAuthentication]
    def get(self, request):
        # 直接赋值即可,Django会自动标记Session修改并在请求结束时持久化
        request.session['name'] = 'SRJ'
        # 若修改Session内嵌套的可变对象(比如字典、列表),需要手动标记修改:
        # request.session['user_info'] = {}
        # request.session['user_info']['name'] = 'SRJ'
        # request.session.modified = True
        return Response({"code": 0, "msg": "session写入成功"})

其他视图读取Session

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication

class GetSessionAPI(APIView):
    authentication_classes = [SessionAuthentication]
    def get(self, request):
        # 优先用get方法读取,避免KeyError,可设置默认值
        user_name = request.session.get('name', '')
        return Response({"code": 0, "data": {"name": user_name}})

快速验证技巧

如果配置后依然无法读取,可以先访问Django自带Admin后台完成登录,登录后刷新页面如果能保持登录状态,说明Session中间件本身运行正常,问题一定出在跨域凭证配置或DRF的认证/权限拦截逻辑上,逐行排查对应配置即可。

内容的提问来源于stack exchange,提问作者I'mSRJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:51:19