【发布时间】:2019-03-28 16:04:09
【问题描述】:
我在将我的 DJANGO 应用程序从 1.11 迁移到 2.1 时遇到问题
在开发过程中,我在端口 3000 上有一个 node.js 服务器(前端),在 8000 上有一个 DJANGO 开发服务器。前端使 Ajax 调用受 CSRFtoken 保护。
我有一个使用 @ensure_csrf_cookie 装饰器在前端调用的视图。
第一次我通常不得不去 chrome://net-internals/#events 启动前端,获取从服务器返回的 csrftoken 值,然后创建相关 cookie。不幸的是,cookie 不会使用此配置自动创建。
问题是。即使在完全刷新之后,Django 1.11 也会生成相同的 CSRFToken,因此在第一次之后,cookie 将等于生成的令牌。 Django 2.1 每次都会更改 csrftoken,所以我无法创建 cookie,因为它总是等于之前的值。
为什么 Django 2.1 更改了 csrftoken,即使默认持续时间是 1 年?
【问题讨论】:
-
我认为您可能会受到ticket 20869 的影响。然而,这表明令牌开始更改 Django 1.10 中的每个请求,所以我不确定为什么您会看到从 1.11 到 2.1 的行为变化。
-
有没有办法强制 Django 使用相同的令牌?在网上搜索我没有找到任何解决方案
-
不,没有任何方法可以在不修补 Django 的情况下改变行为。出于安全原因进行了更改,因此您不应尝试撤消它。
-
我不清楚为什么不能通过向使用
@ensure_csrf_cookie decorator的视图发出请求来从 cookie 中获取 cookie 值。 cookie 值保持不变,只是每次请求都会更改令牌。 -
因为在开发模式下,由于服务器端口不同(我想),
@ensure_csrf_cookie不会在客户端存储cookie。所以我必须手动存储,但是如果值发生变化,当客户端读取 cookie 时,我会读取一个旧值,因此在尝试登录时(例如),Django 返回一个关于 CSRF Token 的错误。
标签: django