2012-10-26 1 views
7

J'utilise la fonction getCookie du django documentation pour obtenir la valeur csrfmiddlewaretoken.Ajax, CSRF et DELETE

J'ai l'appel ajax suivant:

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

Lorsque ce code est exécuté alors django déclenche une exception 403 me disant que la vérification CSRF a échoué. Cependant, si je change le type de DELETE en POST puis django est heureux à ce sujet et ne se plaint pas du tout.

je n'étais pas vraiment en mesure de trouver quelque chose d'utile dans Google à ce sujet, mais je l'ai trouvé cet (maintenant fermé et fixe) billet: https://code.djangoproject.com/ticket/15258

Si je comprends bien, alors ce problème a été résolu dans la 1.4 jalon. J'utilise django 1.4 mais je ne peux toujours pas vérifier le jeton CSRF avec une requête DELETE.

Ai-je raté quelque chose ici?

Répondre

19

Cela semble être un bug jQuery, causé par une certaine confusion quant à savoir si l'effacement des données doivent être jointes à l'URL (comme une requête GET) ou le corps de la demande (comme un POST)

Voir this bug report.

Vous pouvez probablement contourner ce problème en utilisant la méthode CSRF alternative pour les appels AJAX, en définissant un en-tête X-CSRFToken sur la demande. Essayez de changer votre appel AJAX pour ressembler à ceci:

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

merci beaucoup! Cela a résolu le problème :) et là, je blâmais les trucs csrf-middleware. – Pablo

+0

Wow. Je n'aurais jamais pensé ça par moi-même. Merci. –