DRF项目调用Django set_cookie后浏览器未存储Cookie的问题
你的问题本质是前后端跨域场景下CORS配置不符合浏览器安全策略,导致浏览器拦截了Cookie存储逻辑,同时错误的自定义响应头配置引发了额外的CORS报错,可按以下步骤修复:
1. 正确配置Django跨域规则
不要手动编写CORS响应头,使用官方推荐的django-cors-headers包处理:
- 安装依赖
pip install django-cors-headers
- 配置
settings.py
INSTALLED_APPS = [ # ... 其他原有应用 'corsheaders', ] MIDDLEWARE = [ # 必须放在最顶部,优先级高于CommonMiddleware 'corsheaders.middleware.CorsMiddleware', # ... 其他原有中间件 'django.middleware.common.CommonMiddleware', ] # 核心配置:允许跨域请求携带凭证(包含Cookie) CORS_ALLOW_CREDENTIALS = True # 显式指定允许的前端源地址,绝对不能使用通配符* CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # 替换为你的前端本地开发地址 "https://你的生产前端域名.com", ]
2. 修正Cookie设置参数
根据部署场景给Cookie添加符合浏览器安全要求的属性:
# 本地同站开发用配置 response.set_cookie( "country_code", code, samesite="Lax", path="/" ) # 生产环境跨站部署用配置(必须走HTTPS协议) response.set_cookie( "country_code", code, samesite="None", # 跨站场景必须设为None secure=True, # SameSite=None的Cookie强制要求开启Secure属性 path="/" )
3. 修正前端请求配置
你之前的credentials是fetch的顶层配置项,不是请求头参数,报错原因是你错误将它加到了请求头中,正确配置如下:
fetch('你的后端接口地址', { method: 'GET', // 替换为实际请求方法 credentials: 'include', // 放在配置根级别,不要写到headers对象内 headers: { 'Content-Type': 'application/json' // 不要在这里添加credentials字段 } })
4. 清理无效配置
删掉你之前手动添加的response["Access-Control-Allow-Headers"]="true"这类自定义CORS响应头,django-cors-headers会自动生成符合规范的响应头,手动添加会导致配置冲突引发报错。
配置完成后重启Django服务,清空浏览器缓存再测试即可,Cookie会自动被浏览器存储,后续请求也会自动携带。
内容的提问来源于stack exchange,提问作者JhonyBony
相关产品推荐
相关产品推荐

