Requête ajax jquery + Django avec crsf validator

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.