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

Django中设置Cookie存储refresh token失效及属性报错问题

问题定位

你遇到的两个异常分别对应两类使用错误:

  • AttributeError: 'Response' object has no attribute 'set_cookie':你导入的Response类并非Django/DRF提供的响应类,大概率是误导入了requests库等其他第三方库的Response对象,这类对象没有内置set_cookie()方法。
  • 用HttpResponse.set_cookie()设置后Postman取不到Cookie:属于Cookie参数配置不匹配、Postman配置或代码逻辑问题,和set_cookie方法本身无关。
可直接复用的正确实现

DRF框架下的写法(推荐)

确保你导入的是DRF自带的Response类,直接在响应实例上调用set_cookie即可,注意参数配置:

from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from django.conf import settings

def login_view(request):
    # 省略账号密码校验、用户查询逻辑
    refresh = RefreshToken.for_user(user)
    access_token = str(refresh.access_token)
    
    # 构造响应
    resp = Response({
        "code": 0,
        "msg": "login success",
        "data": {"access": access_token}
    })
    
    # 设置refresh token到Cookie
    resp.set_cookie(
        key="refresh_token",
        value=str(refresh),
        max_age=604800,  # 有效期7天,和refresh token过期时间保持一致
        httponly=True,   # 核心配置:禁止前端JS读取,防XSS窃取
        secure=(not settings.DEBUG),  # 生产环境(DEBUG=False)强制HTTPS才传输Cookie
        samesite="Lax", # 防CSRF,跨域场景可按需调整为None(必须同时开secure=True)
        path="/"        # 全站路径生效
    )
    return resp

原生Django视图的写法

如果不用DRF,直接返回JsonResponse即可,set_cookie用法完全一致:

from django.http import JsonResponse

def login_view(request):
    # 省略校验逻辑
    resp = JsonResponse({"code":0, "msg":"login success", "data":{"access": access_token}})
    resp.set_cookie(
        key="refresh_token",
        value=refresh_token_str,
        max_age=604800,
        httponly=True,
        secure=(not settings.DEBUG),
        samesite="Lax",
        path="/"
    )
    return resp
Postman取不到Cookie的排查清单

按顺序检查以下项即可定位问题:

  • 代码逻辑检查:确认set_cookie调用写在return响应之前,没有在设置Cookie后重新构造/覆盖响应对象
  • Cookie参数匹配:打开Postman请求的Cookies面板,检查Cookie的domain、path和你当前请求的地址完全匹配:比如你请求127.0.0.1:8000时,Cookie的domain不能设为localhost,path设为/即可规避路径匹配问题
  • 协议匹配:如果Cookie设置了secure=True,必须用https://协议发请求,HTTP请求下Postman/浏览器都会直接丢弃这个Cookie
  • Postman配置检查:打开Postman Settings -> General,确认Cookie Jar功能是开启状态,测试域名没有被加入Cookie拦截列表
  • 跨域场景检查:如果是前后端分离跨域调试,安装django-cors-headers后必须配置CORS_ALLOW_CREDENTIALS = True,且CORS_ALLOWED_ORIGINS不能设为通配符*,否则跨域请求不会存储Cookie

安全提示:存储refresh token的Cookie必须开启httponly=True,生产环境必须开启secure=True,避免token被XSS、中间人攻击窃取。

内容的提问来源于stack exchange,提问作者Firas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:45:30