Hay dos pasos para configurar el token CSRF, si desea publicar sin un formulario.
1) Obtenga csrftoken
de Cookie.
2) Una vez que tenga el csrftoken, debe configurar el encabezado con csrftoken (antes de PUBLICAR los datos).
1) Obtenga csrftoken
de Cookie.
// Function to GET csrftoken from Cookie
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');
2) Una vez que tenga la csrftoken, se debe establecer la cabecera con csrftoken (antes de publicar los datos).
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
// Function to set Request Header with `CSRFTOKEN`
function setRequestHeader(){
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
}
function postSomeData() {
.....
setRequestHeader();
$.ajax({
dataType: 'json',
type: 'POST',
url: "/url-of-some-api/",
data: data,
success: function() {
alert('success');
},
error: function() {
alert('error');
}
});
}
Gracias por la punta con Firebug. Eso lo hizo. Podría ver el Token en la Cookie y el que está en la solicitud. Descubrí que el problema no estaba en esta parte de mi aplicación. Para responder a mi pregunta: El campo de etiqueta de plantilla no es necesario debido a esta función Pre-AJAX. ¿Derecha? –
Sí, y si entiendo los documentos correctamente, Django está superando la etiqueta de la plantilla por completo, prefiriendo las cookies para manejar el token CSRF. –