2010-07-17 4 views
15

Tengo una vista Django que recibe POST que no necesitan tener el token CSRF. Por lo tanto, utilicé el decorador @csrf_exempt en la vista. El problema es que a veces no emito una respuesta desde la vista (es un bot de Twitter, recibe un HTTP POST para cada tweet y no quiero responder a cada tweet). Cuando no emitir una respuesta me sale el siguiente error:Deshabilitar Django CSRF para vistas que no siempre tienen una respuesta

Traceback (most recent call last): 

File "/home/adam/webapps/newman/lib/python2.5/django/core/handlers/base.py", line 100, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 

File "/home/adam/webapps/newman/lib/python2.5/django/views/decorators/csrf.py", line 24, in wrapped_view 
    resp.csrf_exempt = True 

AttributeError: 'NoneType' object has no attribute 'csrf_exempt' 

resp (que supongo es la respuesta) es ninguno porque la vista se salió con sólo return. ¿Cómo puedo evitar este error y aún no requerir tokens CSRF en el POST?

Gracias!

+0

Muestra algo de código! –

Respuesta

7

Django realmente espera que las funciones de vista devuelvan respuestas. ¿Tal vez podría devolver una respuesta vacía en lugar de None? ¿O devolver un código de error HTTP?

9

Sé que ya obtuvo su respuesta, y de hecho, tiene razón; pero además de eso: ¡no solo Django realmente espera que las vistas devuelvan una respuesta, su cliente también! Es un error de HTTP y probablemente un desperdicio de recursos no devolver algo (y así cerrar la conexión de inmediato).

Creo que un 204 Sin contenido o 304 Sin modificar (vea: HTTP Status Codes) son los códigos http apropiados para usar en esta situación; en django:

return HttpResponse(status=204) 

o

from django.http import HttpResponseNotModified 
return HttpResponseNotModified()