Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 使用javascript更新CSRF表单输入_Django_Forms_Angularjs_Csrf_Django Csrf - Fatal编程技术网

Django 使用javascript更新CSRF表单输入

Django 使用javascript更新CSRF表单输入,django,forms,angularjs,csrf,django-csrf,Django,Forms,Angularjs,Csrf,Django Csrf,我在一个页面上有多个表单,都使用CSRF令牌模板标记{%CSRF_token%}Im使用Angular$http发布表单 所有的表单都有相同的CSRF令牌,所以当我发布一个表单时,其他表单无效 是否有一种方法,当我发布表单时,我可以从服务器获得一个新的CSRF令牌,用于更新表单 我尝试使用$http headers()从响应头获取新的CSRF令牌,但它不可用。在您的登录请求后,应更新包含CSRF令牌的浏览器cookie。您应该能够从csrftokencookie中获取新令牌,如下所示: 有点像黑

我在一个页面上有多个表单,都使用CSRF令牌模板标记{%CSRF_token%}Im使用Angular$http发布表单

所有的表单都有相同的CSRF令牌,所以当我发布一个表单时,其他表单无效

是否有一种方法,当我发布表单时,我可以从服务器获得一个新的CSRF令牌,用于更新表单


我尝试使用$http headers()从响应头获取新的CSRF令牌,但它不可用。

在您的登录请求后,应更新包含CSRF令牌的浏览器cookie。您应该能够从
csrftoken
cookie中获取新令牌,如下所示:


有点像黑客,但这就是我最后做的:

在我的回答中,我明确地设置了新的CSRF令牌值

response['new_csrf'] = self.request.META['CSRF_COOKIE']
return response
然后可以使用Angular$headers()在客户端上访问它

然后我更新$hhtp post标题

$http.defaults.headers.post['X-CSRFToken'] = new_csrf;

CSRF中间件不会在使用时使令牌失效。CSRF令牌仅在新登录时更改;只要同一用户登录,它就保持不变。你的问题并不是因为CSRF令牌无效造成的,除非你发布的表单实际执行了登录。更详细一点,我在同一页上有一个注册和登录表单,两个表单都有一个令牌CZQOkC6LUEOixqFYzDiZYlTyY89KoFII。我可以注册为用户,但是如果我尝试登录同一页面(不刷新),我会得到403禁止的“CSRF令牌丢失或不正确”?+1作为角度cookie建议,但是,尽管csrftoken在请求中,我在$cookie中没有看到它(我看到所有其他cookie)任何建议能否检查您是否在原始
文档.cookie
字符串中看到
csrftoken
?Angular可能会向您提供陈旧的数据,但浏览器cookie存储应该已经用您的AJAX响应接收到的新CSRF令牌更新。文档中也缺少CSRF。cookie我应该提到:(关于如何获取新CSRF令牌(从AJAX响应接收)的任何想法)。我尝试了$headers,但没有luckAt。在调用您的视图时,CSRF令牌应该已经重新生成。您应该能够在视图中以
请求的方式访问新令牌。CSRF_令牌
。您可以安排以某种方式显式传递响应。这就是我最后所做的,有点麻烦。我将CSRF令牌显式设置为n响应,并使用$header()获取该响应并更新Angular post头
response['new_csrf'] = self.request.META['CSRF_COOKIE']
return response
var new_csrf = headers()['new_csrf']
$http.defaults.headers.post['X-CSRFToken'] = new_csrf;