De acuerdo con la documentación de django, para la solicitud de ajax en 1.3 (al menos con Jquery), solo necesitamos agregar este snippet al archivo js principal. Este fragmento obtiene csrftoken de las cookies y luego lo configura para todas las solicitudes ajax. Eso es trabajo, pero ¿y si csrftoken no existe en las cookies? Pensé render_to_response y render ambos automáticamente comprueba si csrftoken en sesiones, y lo configuramos para nosotros, si el token no está allí. Pero no lo son. Entonces, ¿debo implementarlo solo? O tal vez hay otra manera de manejar la protección ajax csrf?Problema de Ajax CSRF en Django 1.3
Respuesta
Su cookie sólo contiene el token CSRF, si se utilizó o bien la etiqueta de plantilla {% csrf_token %}
en la plantilla para generar la solicitud, o si se llama get_token
(con el objeto request
como argumento) de django.middleware.csrf
.
La función get_token
establece metainformación sobre el objeto request
que a su vez le dice al middleware django.middleware.csrf.CsrfViewMiddleware
para establecer la cookie.
En cuanto a Ajax, debe pasar el token csrf con cada solicitud. Para jQuery, utilizo el siguiente código:
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
if(!options.crossDomain) {
if(options.data) {
options.data += "&";
} else {
options.data = "";
}
options.data += "csrfmiddlewaretoken={{csrf_token}}";
}
});
Cuando no hay un formulario en una página que ya está usando {%} csrf_token%, no se enviará la cookie. Por lo tanto, como ha notado, obtendrá un error cuando intente utilizar Ajax en dicha página. Esto conducirá a un comportamiento errático si tiene un sitio con una combinación de páginas con varias combinaciones de formularios y publicaciones ajax.
Esto ya se ha informado y corregido: https://code.djangoproject.com/ticket/15354
La solución en el parche, se debe estirar con 1.3.1, es el decorador ensure_cookie_csrf. Ese decorador no existe en 1.3 o 1.2.5
No hay necesidad de esperar, sin embargo. Sólo tiene que añadir esta línea a cualquier punto de vista que contiene mensajes AJAX una forma CSRF:
request.META["CSRF_COOKIE_USED"] = True
Ejemplo:
def calculator(request):
request.META["CSRF_COOKIE_USED"] = True
return render_to_response('calc.html', {'form': CalcForm()})
FYI - esto es exactamente lo que hace que el decorador.
Una forma que he encontrado para evitar esto es mediante el uso de una forma preexistente como punto de partida para sus datos AJAX.
<form id="ajax_form" stye="display: none;">{% csrf_token %}</form>
entonces usted puede utilizar esto en su código JavaScript a través de la función Serialize JQuery:
var data = $('#ajax_form').serialize();
data += "&mydata=69";
Incluso puede utilizar campos ocultos dentro de esa forma oculta de modo que usted no tiene que utilizar la concatenación de cadenas para construir tus datos POST.
Si está utilizando el decorador @csrf_protect, asegúrese de que tanto la vista con el formulario como la vista de los datos se publiquen para usar el decorador.
Tuve un problema similar. Solo tuve @csrf_protect en la vista de publicación que funcionó bien para probar localmente, pero cuando entré o obtuve un error de verificación 403 añadiendo el decorador a la vista de página fijada en
- 1. CodeIgniter ajax CSRF problema
- 2. JQuery + AJAX + Django = CSRF?
- 3. CSRF con jquery y $ .post en django 1.3
- 4. Problema con Django-1.3 beta
- 5. Django 1.3 en appengine
- 6. token de CSRF para ajax
- 7. csrf error en django
- 8. Django CSRF Token sin formularios
- 9. Ajax llamada fracasar en Django
- 10. Jquery y Django CSRF Token
- 11. Django csrf RequestContext
- 12. Protección CSRF en solicitudes AJAX usando MVC2
- 13. ¿Cómo hacer un DetailView en django 1.3?
- 14. Django: CSRF token de falta o incorrecta
- 15. Verificación Django 1.2.4 CSRF fallida
- 16. testigo Django CSRF no mostrará
- 17. Problema de token de CSRF con CodeIgniter
- 18. Django 1.3 y migraciones del sur
- 19. Falló la verificación de CSRF. Solicitud abortada en django
- 20. ¿Necesito un token CSRF para jQuery .ajax()?
- 21. Django - Falló la verificación de CSRF
- 22. Error de verificación de CSRF, pero solo con IE9
- 23. Lectura de una solicitud HTTP sin procesar en Django 1.3
- 24. Django 1.3 archivos estáticos colocados en los directorios de aplicación
- 25. Django: formulario POST requiere CSRF? GET no?
- 26. Cómo incluir CSRF de Codeigniter en datos ajax
- 27. Django - CSRF token falta o es incorrecto
- 28. Django 1.3 PerfilUsuario coincidencia de consultas no existe
- 29. Django admin plantea la verificación CSRF fallida
- 30. Framework Django CSRF que tiene muchas fallas
Según [documentación de CSRF Django] (https: // docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie), el decorador ensure_cookie_csrf es nuevo para Django 1.4. –
Sí, el decorador ensure_csrf_cookie aterrizó en Django 1.4. Desafortunadamente no en 1.3.1 – bjunix