decorador @csrf_exempt para resolver problemas de ajax en formularios en django 1.2.5

272 views
Skip to first unread message

vrb

unread,
Mar 5, 2011, 11:45:58 AM3/5/11
to Django-es
Hace poco he mudado una de mis aplicaciones de django 1.2.4 a django
1.2.5 y he tenido problemas en cosas que antes funcionaban y en la
nueva versión de django no. En concreto tenía problemas para recargar
select dependientes por ajax con jquery. Al ejecutar la directiva
$post de jquery no me cargaba los select dependientes como antes,
aunque no me daba error. En la consola de firebug vi que había un
problema con los csrf_token y buscando un poco encontré que se puede
solucionar con el decorador @csrf_exempt:

template.html
----------------------------
<script type="text/javascript">
$(document).ready(function() {
$('#periodo').change(function(event){
$.post("{% url recarga-anios %}", {periodo:$
('#periodo').val()}, function(data){
var options = '<option value=""
selected="selected">---------</option>';
for (var i = 0; i < data.length; i++){
options += '<option value="'+data[i]["pk"]+'">'
+data[i]["fields"]["anio"] +'</option>'
}
$('#anios').html(options)
$("#anios option:first").attr('selected',
'selected');
}, "json");
});
});
</scrip>
views.py
----------------------------------
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def anios_dependientes(request):
if request.POST:
periodo_id = request.POST.get('periodo')
periodo = Periodo.objects.get(pk=int(periodo_id))
anios = Anio.objects.filter(periodo = periodo_id)
data = serializers.serialize("json", anios,
fields=('id','anio'))
return HttpResponse(data, mimetype="application/javascript")

Lo publico por si a alguien le puede ayudar esta solución y así le
ahorro algo de tiempo.
Un saludo.

Jairo Peralta

unread,
Mar 5, 2011, 2:20:54 PM3/5/11
to djan...@googlegroups.com


2011/3/5 vrb <escap...@gmail.com>

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.

349.gif

Sebastián Magrí

unread,
Mar 5, 2011, 11:52:40 AM3/5/11
to djan...@googlegroups.com, vrb
> --
> Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
>  Si quieres publicar en este grupo, envía un mensaje de correo
> electrónico a djan...@googlegroups.com
>  Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
>  Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.

Yo también he tenido que aplicar esta "solución" un par de veces, pero
solo como algo rápido y no permanente.

Se supone que csrf_exempt no debería usarse (mucho) debido a que
representa que la vista es vulnerable a CSRF. O me equivoco?

Este problema se ve mucho con el $.post de jQuery, ¿Cuál sería la
mejor solución?

--
Ing. Sebastián Ramírez Magrí
http://sebasmagri.com/

Manuel Saelices

unread,
Mar 6, 2011, 2:13:14 PM3/6/11
to djan...@googlegroups.com, Sebastián Magrí, vrb
El 5 de marzo de 2011 17:52, Sebastián Magrí <sebas...@gmail.com> escribió:

Yo también he tenido que aplicar esta "solución" un par de veces, pero
solo como algo rápido y no permanente.

Se supone que csrf_exempt no debería usarse (mucho) debido a que
representa que la vista es vulnerable a CSRF. O me equivoco?

Este problema se ve mucho con el $.post de jQuery, ¿Cuál sería la
mejor solución?

La mejor solución ha sido documentada hace poco, y se puede ver en el siguiente enlace:


La cosa es tener un fichero javascript que se incluya con ese código (si usas jquery, tendrías que adaptarlo en otros frameworks) y lo invoques en la vista que lanza el post (o si quieres inclúyelo siempre y funcionará si implementas otro POST ajax). Este código capturará cualquier intento de POST en AJAX y le incluirá el valor del CSRF token en una cabecera.

Esto funciona en la versión 1.2.5 y en la 1.3 rc. Si usas la 1.2.5 el snippet a incluir es algo distinto:



Un saludo.
 

--
Ing. Sebastián Ramírez Magrí
http://sebasmagri.com/
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
Manuel Saelices
msae...@yaco.es

Yaco Sistemas
http://www.yaco.es/
C/ Rioja 5, 41004 Sevilla
Móvil    +34 606 039 750
Teléfono +34 954 500 057
Fax      +34 954 500 929

Reply all
Reply to author
Forward
0 new messages