【发布时间】:2018-01-28 09:06:42
【问题描述】:
我做了一个带有登录表单的模式,并通过 POST AJAX 请求提交。我只能登录一次,当我注销并尝试再次登录时,AJAX 请求的错误消息是这样的 (CSRF failed):
Prohibido (403)
Verificación CSRF fallida. Solicitud abortada
只有当我按 F5 刷新整个页面时,才能再次登录。登录成功后,我只刷新标题,而不是整个页面。我的刷新代码是这样的:
$('#update-' + idToUpdate).load(' #' + idToUpdate);
编辑: 我发现 CSRF 令牌仅在成功请求后才有效一次。我必须生成一个新令牌才能使表单再次工作,并且这个令牌只有在我按 F5 刷新整个页面时才会更新,而这正是我不想做的。
这个问题有什么解决办法吗?我不想做 AJAX 请求来更新 CSRF 令牌,这是不安全的。
【问题讨论】:
-
您能具体说说您是如何创建 CSRF 令牌的吗?是通过模板变量还是通过文档中提到的js函数? docs.djangoproject.com/en/1.11/ref/csrf/#ajax
-
<form ... > </form>{% csrf_token %}这就是 Django 的工作方式。它相当于一个用令牌隐藏的输入。