我正在开发带有 React 前端的 Django 后端,并使用会话来管理用户身份验证。成功登录用户后,我正在设置会话数据(例如,user_id、姓名、电子邮件等),但尽管会话数据已正确存储,但会话 ID 返回为 None。
我已将 SESSION_ENGINE 配置为使用数据库并设置 SESSION_SAVE_EVERY_REQUEST = True。 CORS 标头已正确配置为 CORS_ALLOW_CREDENTIALS = True。尽管进行了这些设置,会话 ID 仍无法正确生成或返回,这会导致客户端的会话管理出现问题。如何解决此问题并确保会话 ID 正确生成并在登录后可访问?(https://i.sstatic.net/EawnCfZP.png)
我将 Django 的会话设置配置为使用数据库支持的会话,设置 SESSION_SAVE_EVERY_REQUEST = True,并使用凭据启用 CORS。我希望在用户登录后生成并返回会话 ID,以便进行正确的会话管理。但是,即使会话数据已正确存储且可访问,会话 ID 返回为 None。我还验证了 CORS 和会话设置是否已正确配置,但仍然面临问题。在此处输入图像描述
听起来您已经在 Django 中配置了许多会话管理所需的设置。您可以执行以下一些额外步骤和检查来排除故障并解决问题:
确保
SessionMiddleware
和 AuthenticationMiddleware
包含在 MIDDLEWARE
中的 settings.py
设置中:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
在
settings.py
中仔细检查您的会话设置:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_SECURE = False # Set to True if using HTTPS
CORS_ALLOW_CREDENTIALS = True
确保正确配置 CSRF 设置以允许凭据:
CSRF_COOKIE_SECURE = False # Set to True if using HTTPS
CSRF_COOKIE_HTTPONLY = True
CSRF_TRUSTED_ORIGINS = ['http://localhost:3000'] # Add your frontend domain
request.session.save()
设置会话数据后,显式保存会话:
def login_view(request):
# Your login logic
request.session['user_id'] = user.id
request.session['name'] = user.name
request.session['email'] = user.email
request.session.save() # Explicitly save the session
return JsonResponse({'message': 'Login successful'})
要进行调试,您可以在保存会话后打印会话 ID:
def login_view(request):
# Your login logic
request.session['user_id'] = user.id
request.session['name'] = user.name
request.session['email'] = user.email
request.session.save() # Explicitly save the session
print(f"Session ID after login: {request.session.session_key}")
return JsonResponse({'message': 'Login successful'})
确保浏览器中的会话 cookie 设置正确。您可以在浏览器的开发者工具中的“应用程序”或“存储”选项卡下进行检查。
确保您的 CORS 设置允许凭据和正确的来源:
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000', # Add your frontend domain
]
如果您使用代理(例如 Nginx),请确保将其配置为正确传递 cookie。
确保通过运行迁移在数据库中创建会话表:
python manage.py migrate
检查会话是否由于某些设置而立即过期:
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 1209600 # Two weeks
通过执行这些步骤,您应该能够识别并解决会话 ID 未正确生成或返回的问题。如果问题仍然存在,请分享有关您的设置的更多详细信息,我们可以进一步解决该问题。
您可以使用以下来源以获得更好的参考:
(1) 如何使用 Django 会话。 https://www.youtube.com/watch?v=N-R5mT-nIDk (2) Django 身份验证和用户管理 - 完整教程。 https://www.youtube.com/watch?v=WuyKxdLcw3w (3) 下一个JS | Django Rest Framework - 基于 HttpOnly Cookie 会话的身份验证。 https://www.youtube.com/watch?v=JnGR6W3w0l8 (4) 如何使用session | Django 文档 |姜戈。 https://docs.djangoproject.com/en/5.1/topics/http/sessions/