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

问题描述 投票:0回答:1

我的上下文,我填写我的表格,如果我登录,可以将值保存在数据库中。

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

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

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

django ajax authentication csrf
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.