Django request.session.get() 在不同视图类中返回 None

问题描述 投票:0回答:1

我正在开发 Django 项目,并且遇到了会话变量的问题。我在一个视图中设置了一个会话变量,但是当我尝试在另一个视图中访问它时,它返回 None。

这是我的代码的简化版本:

在我的

LoginVerification
看来:

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

class LoginVerification(APIView):
    def post(request):
        # ... login logic ...

        # If login is successful, I store the AWS access key in the session
        request.session['aws_access_key'] = 'your-access-key'

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

在我的

BucketSize
看来:

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

class BucketSize(APIView):
    def get(self, request):
        # Here, I try to retrieve the AWS access key from the session
        aws_access_key = request.session.get('aws_access_key')

        if aws_access_key is None:
            return Response({'status': 'error', 'error': 'No AWS access key found in session.'})

        # ... remaining logic ...

        return Response({'status': 'success', 'bucketsize': bucketsize, 'unit': unit})

在 BucketSize 视图中,request.session.get('aws_access_key') 始终返回 None,即使我已在 LoginVerification 视图中设置它。

这是我的设置.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'server',
    'rest_framework',
    "corsheaders",

]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    

]

我已检查以下内容:

正在设置会话变量:LoginVerification 视图中的代码正在运行,没有错误。

  1. 会话尚未过期:我正在测试 BucketSize 视图 紧接在 LoginVerification 视图之后。
  2. 我还没有清除我的cookies:我一直在使用相同的cookies 用于测试的浏览器会话。
  3. 我使用相同的浏览器会话:我没有切换浏览器或 进入隐身模式。

我想知道为什么 request.session.get('aws_access_key') 在 BucketSize 视图中返回 None ,以及如何解决此问题。

编辑:这是我的其余框架设置--

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ]
}
python django django-rest-framework django-views django-sessions
1个回答
0
投票

要解决您的问题,您需要在分配密钥后调用 .save() 方法。您可以在您的

LoginVerification
中按照以下方式进行操作:

编辑:

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

class LoginVerification(APIView):
    def post(self, request): # self parameter was missing from the function (it can be anything but in python we usually use `self`)
        # ... login logic ...

        # If login is successful, I store the AWS access key in the session
        request.session['aws_access_key'] = 'your-access-key'

        request.session.save()  # Need to save this

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

虽然将访问密钥存储在会话变量中不是一个好主意

© www.soinside.com 2019 - 2024. All rights reserved.