使用Ajax登录后,Django CSRF验证在表单验证上失败

时间:2019-11-09 16:21:09

标签: django ajax authentication csrf

我的情况是,我填写了表格,如果可以登录,可以将值保存在数据库中。

当我单击“登录”按钮时,我打开一个引导模式表单进行登录,并在登录过程中使用Ajax / Jquery。

我了解到登录后CSRF令牌发生了变化,这就是为什么当我验证表单(POST)时,我收到一条消息:“禁止(403)CSRF验证失败。请求中止了。”因为我没有刷新我的页面。

我不知道的是,如何在不丢失已经填写在表单中的所有数据的情况下刷新此令牌?

1 个答案:

答案 0 :(得分:0)

首先将{% csrf_token %}添加到HTML正文中的模板 然后在变量中获取csrf_token值,并将其传递给这样的ajax请求

<script type="text/javascript">

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
</script>

并在js中的变量中获取csrf_token

<script type="text/javascript">
// using jQuery
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
</script>

有关更多信息,请关注https://docs.djangoproject.com/en/2.2/ref/csrf/#setting-the-token-on-the-ajax-request

相关问题