2012-10-26 18 views
7

Używam funkcji getCookie z django documentation, aby uzyskać wartość csrfmiddlewaretoken.Ajax, CSRF i DELETE

Mam następujący ajax połączenia:

var url = reverse_removeprofile.replace(/deadbeef/, key); 
$.ajax({ 
    type:   "DELETE", 
    url:   url, 
    data:   "csrfmiddlewaretoken=" + getCookie("csrftoken"), 
    success:  function() { ... }, 
}); 

Kiedy ten kod zostanie wykonany następnie django prowadzących do 403 wyjątek informujący mnie, że weryfikacja CSRF nie powiodło się. Jeśli jednak zmienię type z DELETE na POST, to jest szczęśliwy z tego powodu i nie narzeka w ogóle.

nie byłem w stanie znaleźć coś pożytecznego w Google na ten temat, ale znalazłem ten (obecnie zamknięte i stałe) bilet: https://code.djangoproject.com/ticket/15258

Jeśli rozumiem go poprawnie wtedy ten problem został rozwiązany w 1,4 milowy krok. Używam django 1.4, ale nadal nie mogę zweryfikować tokena CSRF za pomocą żądania DELETE.

Czy tu czegoś brakuje?

Odpowiedz

19

Wydaje się to być błąd jQuery, spowodowane przez jakiś błąd co do tego, czy dane DELETE powinien być dołączony do adresu URL (jak żądanie GET) lub korpusu (jak żądanie POST)

Zobacz this bug report.

Prawdopodobnie można obejść ten problem, korzystając z alternatywnej metody CSRF dla wywołań AJAX, ustawiając nagłówek X-CSRFToken na żądanie. Spróbuj zmienić swoje połączenie AJAX, aby wyglądało tak:

$.ajax({ 
    type: "DELETE", 
    url: url, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("X-CSRFToken", getCookie("csrftoken")); 
    } 
    success: function() { ... }, 
}); 
+0

dziękuję! To rozwiązało problem :) i tam obwiniałem rzeczy csrf-middleware. – Pablo

+0

Wow. Nigdy bym tego nie wymyślił. Dzięki. –