使用 React Frontend 在 Django 中设置会话数据后,会话 ID 不返回任何内容

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

我正在开发带有 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 和会话设置是否已正确配置,但仍然面临问题。在此处输入图像描述

reactjs django axios cors session-management
1个回答
0
投票

听起来您已经在 Django 中配置了许多会话管理所需的设置。您可以执行以下一些额外步骤和检查来排除故障并解决问题:

1.确保中间件配置正确

确保

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',
]

2.验证会话设置

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

3.检查 CSRF 设置

确保正确配置 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

4.使用
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'})

5.调试会话 ID

要进行调试,您可以在保存会话后打印会话 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'})

6.确保 Cookie 设置正确

确保浏览器中的会话 cookie 设置正确。您可以在浏览器的开发者工具中的“应用程序”或“存储”选项卡下进行检查。

7.跨域资源共享 (CORS)

确保您的 CORS 设置允许凭据和正确的来源:

CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    'http://localhost:3000',  # Add your frontend domain
]

8.检查代理问题

如果您使用代理(例如 Nginx),请确保将其配置为正确传递 cookie。

9.数据库迁移

确保通过运行迁移在数据库中创建会话表:

python manage.py migrate

10.会话到期

检查会话是否由于某些设置而立即过期:

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/

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