2

我确实需要在 Django 中进行相同的 ajax POST 调用。所以我使用 Django 文档中描述的方法:

function csrfSafeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: false, 
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

但是,当我进行 ajax 调用并想为 beforeSend 方法添加一些操作(即显示加载器图像)时,它会删除上述功能。例子:

$.ajax({
    url: "some_url",
    type: "POST",
    data: some_form.serialize(),
    beforeSend: function() { some_element.showLoader();}
});
$.ajax({
    url: "some_other_url",
    type: "POST",
    data: some_other_form.serialize(),
    beforeSend: function() { some_other_element.showLoader();}
});

DRY 很重要,我不想将“showLoader()”函数放在 ajaxSetup 中,因为它可能会有所不同。

4

3 回答 3

3

好吧,没关系,我找到了解决方案。只需使用 ajaxSend():

$(document).ajaxSend(function(event, xhr, settings){
    if (!csrfSafeMethod(settings.type)) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
});
于 2013-09-12T10:25:35.220 回答
3

$.ajax 中传入的配置会覆盖 $.ajaxsetup 中的配置,所以你可以先调用 global beforesend func 再做自定义作业

$.ajaxSetup({
  crossDomain: false, // obviates need for sameOrigin test
  beforeSend: function(xhr, settings) {
    if (!csrfSafeMethod(settings.type)) {
      xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
    }
  }
});

$.ajax({
    type: "POST",
    url: "url",
    data: data,
    beforeSend : function(xhr, settings){
      //call global beforeSend func
      $.ajaxSettings.beforeSend(xhr, settings);
      //add some custom code below
      $("#spinner").show();
      blah blah blah
    },
});
于 2014-01-12T09:07:09.910 回答
0

感谢您为 alekwisnia 提供解决方案!我只想展示解决方案并解释更多:

添加您的头此脚本以创建 csrf 令牌:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@beta/dist/js.cookie.min.js"></script>

并使用 ajax 设置功能将 csrf 令牌添加到您的 ajax 请求标头中:

<script>
var csrftoken = Cookies.get('csrftoken');
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);
    }
  }
});
$(document).ajaxSend(function(event, xhr, settings){
    if (!csrfSafeMethod(settings.type)) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
});
</script>
于 2019-11-24T01:09:37.890 回答