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
按顺序检查以下项即可定位问题:
- 代码逻辑检查:确认
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
相关产品推荐
相关产品推荐

