我正在开发 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 视图中的代码正在运行,没有错误。
- 会话尚未过期:我正在测试 BucketSize 视图 紧接在 LoginVerification 视图之后。
- 我还没有清除我的cookies:我一直在使用相同的cookies 用于测试的浏览器会话。
- 我使用相同的浏览器会话:我没有切换浏览器或 进入隐身模式。
我想知道为什么 request.session.get('aws_access_key') 在 BucketSize 视图中返回 None ,以及如何解决此问题。
编辑:这是我的其余框架设置--
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
]
}
要解决您的问题,您需要在分配密钥后调用 .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"})
虽然将访问密钥存储在会话变量中不是一个好主意