我正在从Django 1.4.3升级到Django 11.3。
我有一个包含2种不同表格的网页。两个表单都加载了{%csrf_token%}。流程是 - 用户使用表单1(ajax)登录,然后显示第二个表单。用户以第二种形式输入数据并使用ajax提交。现在,如果我做了这个请求失败了(在Django 1.4.3下工作) -
csrfmiddlewaretoken = $form.find('input[name="csrfmiddlewaretoken"]').val();
现在,为了解决这个问题,我从cookie获取csrftoken值并将cookie作为ajax的一部分发送并且它有效 -
csrfmiddlewaretoken = _getHelperCookie('csrftoken');
我很困惑为什么让客户端cookie工作?登录后,Django调用rotate_token;实际上这会影响什么?
答案 0 :(得分:1)
正如您所说,当您作为安全措施登录时,Django会轮换CSRF令牌。这started in Django 1.5.2。
由于您已使用ajax请求登录,因此旧令牌仍在html中。从html中获取令牌时,您使用的是旧令牌,因此会出现CSRF错误。
当您从cookie中获取令牌时,您将获得新令牌,以避免错误。