如何在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.sessionsMIDDLEWARE列表中按顺序添加以下两个中间件,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
相关产品推荐
相关产品推荐

