如何在javascript中对具有csrf保护的django框架进行适当的ajax调用?
在您将此标记为重复之前,请通读一遍,因为我已经处理了许多堆栈溢出问题,但找不到合适的解决方案 因此,我面临的问题是,我对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如何在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中,
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);
}
}
});