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

Django跨视图类调用request.session.get()返回None问题求助

问题原因及解决办法

1. 视图方法参数错误(最可能的直接原因)

你的LoginVerification视图的post方法参数定义错误,APIView类的视图方法第一个参数必须是self,第二个才是request。当前写法会导致request变量实际指向视图实例本身,而非HTTP请求对象,因此你设置的request.session根本不是当前用户的会话,后续视图自然无法获取到。

修正后的LoginVerification视图代码:

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

class LoginVerification(APIView):
    # 修正参数顺序:self在前,request在后
    def post(self, request):
        # ... 登录逻辑 ...

        # 登录成功后,将AWS访问密钥存储到会话中
        request.session['aws_access_key'] = 'your-access-key'

        return Response({"message": "Login successful"})

2. 跨域请求的凭证传递问题

如果前端和后端是跨域部署(比如前端在localhost:3000,后端在localhost:8000),需要确保以下配置:

  • 在Django的settings.py中开启跨域凭证支持:
    CORS_ALLOW_CREDENTIALS = True
    # 同时指定允许的前端源,示例:
    CORS_ALLOWED_ORIGINS = [
        "http://localhost:3000",
        # 其他需要允许的前端域名
    ]
    
  • 前端发起请求时需携带凭证(以Axios为例):
    axios.post('/api/login', data, { withCredentials: true })
    axios.get('/api/bucket-size', { withCredentials: true })
    

3. CSRF令牌验证问题

由于你使用了SessionAuthentication,Django的CSRF中间件会对POST请求进行验证,若前端未正确传递CSRF令牌,会话可能无法正常工作:

  • 在前端页面通过模板标签获取CSRF令牌:
    <meta name="csrf-token" content="{% csrf_token %}">
    
  • 在请求头中携带令牌:
    axios.defaults.headers.common['X-CSRFToken'] = document.querySelector('meta[name="csrf-token"]').content;
    

4. 会话中间件顺序验证

检查MIDDLEWARE配置,SessionMiddleware必须在AuthenticationMiddleware之前,你的当前配置是正确的,后续调整时需保持该顺序,否则会话无法被正确初始化。


内容的提问来源于stack exchange,提问作者Suprava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:22:26