2013-09-12 4 views
1

Мне нужно сделать такие же ajax POST-вызовы в Django. Поэтому я использую метод, описанный в Django документах:Django ajax POST extend beforeSend метод, используемый для защиты CSRF

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, потому что она может отличаться.

ответ

2

Хорошо, неважно, я нашел решение. Просто используйте ajaxSend():

$(document).ajaxSend(function(event, xhr, settings){ 
    if (!csrfSafeMethod(settings.type)) { 
     xhr.setRequestHeader("X-CSRFToken", csrftoken); 
    } 
}); 
3

Конфигурационный передается в $ .ajax перекроет конфигурации в $ .ajaxSetup, так что вы можете вызвать глобальную 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 
    }, 
}); 
Смежные вопросы