Requête ajax jquery + Django avec crsf validator
Article d'archive. Publié il y a plus de six ans, il peut décrire des versions ou des pratiques qui ont depuis évolué. Nous le laissons en ligne pour sa valeur documentaire.
Bonjour,
Vous souhaitez donner du dynamisme à votre site et donc utiliser un peu d’ajax avec Jquery. Malheureusement, si vous appelez une url ajax en passant des données en POST, alors Django va vous faire une très jolie “crsf verification error”, ce qui n’est pas vraiment le comportement attendu.
Pour résoudre ce problèmes, plusieurs possibilités s’offrent alors à vous :
- Soit vous mettez ce code @csrf_exempt avant la méthode view concernées pour annuler la vérification du csrf:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def ajax_upload( request ):
if request.method == "POST":
return True
- Soit vous passez les bons paramètres dans la requête ajax :
$.ajax({
url: '/my/ajax/url',
type: 'POST',
dataType : 'json',
data: { "data1" : "test"} ,
success : function(data) {
//On success
},
error : function(data) {
//On error
},
beforeSend: function(xhr, settings) {
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
});
Ainsi vous n’aurez plus de problèmes de csrf vérification avec Django. Je recommande néanmoins d’utiliser la seconde méthode.