Django会话无法持久化:Postman正常但React前端异常求助
问题排查与解决方案
一、跨域请求未携带Session Cookie(核心问题)
Postman会自动保存并携带Cookie,但React前端默认不会在跨域请求中传递Cookie,这就是为什么前端调用时session为空的关键原因。
前端调整
在你的请求工具(比如axios)里开启withCredentials:
// 全局配置示例(axios) import axios from 'axios'; axios.defaults.withCredentials = true; // 单个请求配置示例 axios.post('/api/add_core_user_details', 你的请求数据, { withCredentials: true });
Django后端CORS配置
确保django-cors-headers的配置允许携带Cookie:
- 没装依赖先装:
pip install django-cors-headers - 修改
settings.py:
INSTALLED_APPS = [ # ...其他已有的应用 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 必须放在CommonMiddleware前面 'django.middleware.common.CommonMiddleware', # ...其他中间件 ] # 这里填你的React前端地址,不能用*,否则无法携带Cookie CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # 线上环境的前端地址也可以加在这里 ] # 允许跨域携带Cookie CORS_ALLOW_CREDENTIALS = True
二、Admin看不到Session表的问题
Admin里看不到session表,要么是你没使用数据库存储session,要么是没执行迁移生成表。
检查Session存储配置
看settings.py里的SESSION_ENGINE:
- 如果是默认的
django.contrib.sessions.backends.db,执行迁移生成表:
python manage.py migrate
执行后django_session表会被创建,同时确保django.contrib.sessions在INSTALLED_APPS里,Admin就能看到session数据了。
- 如果用的是缓存类存储引擎(比如
django.contrib.sessions.backends.cache),数据存在缓存里,Admin自然看不到。要是需要在Admin查看session,改成数据库存储即可。
三、接口逻辑的细节检查
- 确保
create_login里写入session的逻辑没问题:
def create_login(request): # ...你的用户创建逻辑 user_id = str(user_doc._id) # MongoDB的ObjectId要转成字符串存session request.session['user_id'] = user_id request.session.save() # 显式保存session,避免异步场景下丢失 # ...返回响应
- 在
add_core_user_details里先判断session是否存在,避免KeyError:
def add_core_user_details(request): user_id = request.session.get('user_id') if not user_id: return JsonResponse({'error': '未获取到用户身份'}, status=401) # ...后续业务逻辑
四、验证步骤
- 重启Django服务和React应用,确保配置生效。
- 打开浏览器开发者工具的
Application标签,检查Cookie里有没有Django的sessionid,并且请求时是否携带了这个Cookie。
内容的提问来源于stack exchange,提问作者ben_11
相关产品推荐
相关产品推荐

