You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF项目调用Django set_cookie后浏览器未存储Cookie的问题

DRF跨域场景下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:06:03