Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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
如何在javascript中对具有csrf保护的django框架进行适当的ajax调用?_Javascript_Ajax_Django_Django Csrf - Fatal编程技术网

如何在javascript中对具有csrf保护的django框架进行适当的ajax调用?

如何在javascript中对具有csrf保护的django框架进行适当的ajax调用?,javascript,ajax,django,django-csrf,Javascript,Ajax,Django,Django Csrf,在您将此标记为重复之前,请通读一遍,因为我已经处理了许多堆栈溢出问题,但找不到合适的解决方案 因此,我面临的问题是,我对django是新手,了解了POST请求的CSRF保护。我已经在一个非基于ajax的页面上成功地实现了这些调用。但我目前正在做的项目是一个单页的应用程序。因此,所有调用都是通过ajax和vanila JS进行的,不使用任何库。我面临的问题是,对于第一个请求,我获得了在模板中生成的有效CSRF令牌。但是在第一次ajax调用之后,CSRF令牌发生了变化。所以我想知道在django中,

在您将此标记为重复之前,请通读一遍,因为我已经处理了许多堆栈溢出问题,但找不到合适的解决方案

因此,我面临的问题是,我对django是新手,了解了POST请求的CSRF保护。我已经在一个非基于ajax的页面上成功地实现了这些调用。但我目前正在做的项目是一个单页的应用程序。因此,所有调用都是通过ajax和vanila JS进行的,不使用任何库。我面临的问题是,对于第一个请求,我获得了在模板中生成的有效CSRF令牌。但是在第一次ajax调用之后,CSRF令牌发生了变化。所以我想知道在django中,对于这种情况,什么是正确的方法。我是否应该让所有请求以某种方式响应CSRF令牌,并将它们保存在JS变量中

目前还有两个页面。第一个是一个简单的登录模板,它没有ajax调用。它使用凭据发布到主页,如果有效,则完成。但在家里有多种形式。提交它们中的任何一个都会改变令牌,所以我如何处理这样的情况

PS:我更喜欢纯JS中的代码,而不是jquery或任何其他框架中的代码,我不想禁用csrf保护

我已经想到,将CSRF令牌存储在cookie或会话变量中,这样做会破坏令牌的全部用途

请附上一个我可以学习的示例代码

我面临的问题是,对于我收到的第一个请求 我在模板中生成的有效CSRF令牌。但是在 首先ajax调用CSRF令牌更改

我不相信这是真的。否则,如果用户打开多个选项卡,任何django应用程序都将停止工作

以下是我在Web应用程序上使用的解决方案。它按预期工作,但我没有按照官方建议从cookie中获取令牌值。为什么?更少的代码

myapp/templatetags/csrf_ajax.html _csrf_ajax.html 我面临的问题是,对于我收到的第一个请求 我在模板中生成的有效CSRF令牌。但是在 首先ajax调用CSRF令牌更改

我不相信这是真的。否则,如果用户打开多个选项卡,任何django应用程序都将停止工作

以下是我在Web应用程序上使用的解决方案。它按预期工作,但我没有按照官方建议从cookie中获取令牌值。为什么?更少的代码

myapp/templatetags/csrf_ajax.html _csrf_ajax.html
csrttoken存储在Cookie中,不会随每个ajax请求而更改。我将此代码保存在js文件中,并将其添加到需要发送ajax post请求的任何页面(它使用jQuery,如果不想使用外部库,则需要将其转换为纯JavaScript):


csrttoken存储在Cookie中,不会随每个ajax请求而更改。我将此代码保存在js文件中,并将其添加到需要发送ajax post请求的任何页面(它使用jQuery,如果不想使用外部库,则需要将其转换为纯JavaScript):


是的,您应该将其存储在JS变量中,并将其与ajax请求一起发送。“你到底试过哪些不起作用的方法?”丹·克拉森我没有试过,但想知道正确的处理方法。如果基于ajax的表单与普通表单混合使用,那么这种情况会怎样。这种情况下的解决方案是什么?是的,您应该将其存储在JS变量中,并随ajax请求一起发送。“你到底试过哪些不起作用的方法?”丹·克拉森我没有试过,但想知道正确的处理方法。如果基于ajax的表单与普通表单混合使用,那么这种情况会怎样。在这种情况下,解决方案是什么?
from django import template

register = template.Library()


@register.inclusion_tag('myapp/_csrf_ajax.html')
def csrf_ajax():
    # https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax

    return {}
<script>
(function () {
    var csrf_token = "{{ csrf_token }}";
    function csrfSafeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrf_token);
            }
        }
    });
})();
</script>
{% csrf_ajax %}
var csrftoken = $.cookie('csrftoken');

function csrfSafeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});