2012-10-26 9 views
7

Ich benutze die getCookie Funktion von django documentation, um den csrfmiddlewaretoken Wert zu erhalten.Ajax, CSRF und DELETE

Ich habe folgenden Ajax-Aufruf:

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

Wenn dieser Code ausgeführt wird dann django wirft eine 403 Ausnahme mir zu sagen, dass die CSRF Überprüfung fehlgeschlagen. Jedoch, wenn ich die type von DELETE zu POST ändere, dann ist django glücklich darüber und beklagen sich überhaupt nicht.

Ich war nicht wirklich in der Lage, etwas Nützliches in Google darüber zu finden, aber ich habe diese (jetzt geschlossen und fest) gefunden Ticket: https://code.djangoproject.com/ticket/15258

Wenn ich es richtig verstehe, dann hat dieses Problem in dem fest 1.4 Meilenstein. Ich benutze django 1.4, aber ich kann das CSRF Token mit einer DELETE Anfrage noch nicht überprüfen.

Fehle ich hier etwas?

Antwort

19

Dies scheint ein jQuery Fehler zu sein, durch einige Verwirrung verursacht, ob DELETE Daten sollten (wie eine GET-Anforderung) oder der Anfrage Körper an die URL angehängt werden (wie ein POST)

this bug report See.

Sie können dies wahrscheinlich umgehen, indem Sie die alternative CSRF-Methode für AJAX-Aufrufe verwenden und einen Header X-CSRFToken für die Anforderung festlegen. Versuchen Sie, Ihren AJAX-Anruf wie folgt zu ändern:

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

Vielen Dank! Das hat das Problem gelöst :) und da habe ich die csrf-Middleware gestolpert. – Pablo

+0

Wow. Das hätte ich nie alleine herausgefunden. Vielen Dank. –

Verwandte Themen