Foros del Web » Programando para Internet » Python »

Ajax & Django csrf token

Estas en el tema de Ajax & Django csrf token en el foro de Python en Foros del Web. Hola todos. Estoy tratando de que me funcione enviar un post request con ajax. En django como sabemos se necesita que el post request incluya ...
  #1 (permalink)  
Antiguo 08/04/2014, 21:15
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 11 años, 1 mes
Puntos: 2
Ajax & Django csrf token

Hola todos. Estoy tratando de que me funcione enviar un post request con ajax. En django como sabemos se necesita que el post request incluya el {%csrf token%}. No logro solucionar esa parte, me da un error 403 debido al csrf token.

jquery, una simple ajax post:
Código:
$('.vote-up').on('click', vote_up);
function vote_up(){
	$(this).addClass("btn-warning");
	$.ajax({
		data: {'data':'ajax_data'},
		url: '/temas/prueba_ajax/',
		type: 'post',
		success: function(data){
			console.log(data);
			$('.vote_up').removeClass("btn-warning");
		}
		});
	}
</script>
*funciona si le cambio de post a get.

lo que estoy haciendo es seguir las instrucciones de la documentación de django 1.6 :

incluí este script antes de la ajax call:
Código:
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;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
function sameOrigin(url) {
    // test that a given url is a same-origin URL
    // url could be relative or scheme relative or absolute
    var host = document.location.host; // host + port
    var protocol = document.location.protocol;
    var sr_origin = '//' + host;
    var origin = protocol + sr_origin;
    // Allow absolute or scheme relative URLs to same origin
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
        (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
        // or any other URL that isn't scheme relative or absolute i.e relative.
        !(/^(\/\/|http:|https:).*/.test(url));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
            // Send the token to same-origin, relative URLs only.
            // Send the token only if the method warrants CSRF protection
            // Using the CSRFToken value acquired earlier
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
Tambien probé usando:

var csrftoken = $.cookie('csrftoken'); y @ensure_csrf_cookie



Visité un montón de referencias en internet pero muchos son de versiones pasadas y no funcionan.

Etiquetas: ajax, django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:38.