domingo, 6 de marzo de 2011

Ajax con Django 1.2.5

Hace unos días cambie la versión de Django en uno de mis proyectos en desarrollo de la versión 1.2.4 a la 1.2.5 y me tope con el inconveniente de que mis llamadas ajax no funcionaban ya como antes. Investigando un poco, me di cuenta que en la versión actual de Django, las llamadas Ajax requieren una cabecera X-CSRFToken que incluyan el csrf_token.

En la nota de publicación de Django 1.2.5, dan un ejemplo de como hacer para poder tomar el token con JQuery, pero como a mi no me ha funcionado, he hecho una modificación sencilla de dicho ejemplo que me funciona muy bien y la comparto a continuación:

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken",
$('input[name="csrfmiddlewaretoken"]').val());
}
}
});


Con esto, todas las peticiones Ajax que hagamos de ahora en adelante, incluyen automáticamente el token para que nos funcionen correctamente las llamadas ajax.

Actualización: Olvide comentar que mi código toma el csrf_token desde el formulario, en mi proyecto, hay una validación para que si el valor que trato de obtener con $('input[name="csrfmiddlewaretoken"]').val() es diferente de '' ejecute el código publicado en este artículo.
Publicar un comentario en la entrada