解决方法-实践
后端接口设置了需要登陆才可以访问,浏览器前端调用接口,报错失败原因是xxx的服务端没有收到对应的cookie。
@login_required
def my_view(request):
# 这里的代码只会在用户登录后执行
# 你的逻辑代码
return render(request, 'my_template.html')
看输出信息,应该是cookie的SameSite属性不正确的问题,但是以前没这个问题啊。最后,经过查看各种资料发现,chrome升级到80版本之后,cookie的SameSite属性默认值由None变为Lax。
解决方式如下:
- 最简单(适合临时调试):设置chrome为禁用samesite。需要每个客户端修改设置,不现实。打开链接:chrome://flags/#same-site-by-default-cookies。然后搜索:SameSite by default cookies,将default改成disable即可。
-
修改程序,主动设置SameSite属性。Django版本高于2.1,直接设置SESSION_COOKIE_SAMESITE=None即可;
-
如果DJango版本低于2.1需要引入库django-cookie-samesite来处理:
- 安装django cookies samesite: pip install django-cookies-samesite
- 将中间件添加到中间件类的顶部MIDDLEWARE_CLASSES = ( ‘django_cookies_samesite.middleware.CookiesSameSite’, … )
- 在settings.py中设置首选的samesite策略:
SESSION_COOKIE_SECURE = True SESSION_COOKIE_SAMESITE = 'None'
坑
- 注:必须同时有secure这个属性才行。真是个坑!
总结
根据上述,总共三种操作方式,汇整如下:
-
最简单:设置chrom为禁用samesite
-
DJango版本低于2.1:引入库django-cookie-samesite来处理
-
Django版本高于2.1:直接设置SESSION_COOKIE_SAMESITE=None