Django: ¿Cómo detectar una excepción específica en una vista basada en clase durante el procesamiento de plantillas?

¿Cómo se detecta una excepción específica durante la representación de plantillas de Django en una vista basada en clase?

Tengo una excepción personalizada ImmediateHttpResponse que pretende causar un redireccionamiento inmediato en mi vista basada en clase. Yo he tratado:

 def dispatch(self, *args, **kwargs): try: return super(AppConnectionsView, self).dispatch(*args, **kwargs) except ImmediateHttpResponse as e: return HttpResponseRedirect(e.response) 

La excepción que estoy intentando capturar se genera en una etiqueta de plantilla y, por lo tanto, parece que la excepción es interceptada por la depuración de la plantilla de django y recibo una plantilla de error de representación HttpResponseRedirect no exception supplied . Todavía quiero depurar mis plantillas, pero no cuando se genera HttpResponseRedirect.

Por favor, mantenga todos los comentarios acerca de no generar errores en las tags de plantilla … Tengo una razón muy buena.

Si realmente tiene que hacerlo a cualquier costo, aquí hay una solución simple:

 def dispatch(self, *args, **kwargs): response = super(AppConnectionsView, self).dispatch(*args, **kwargs) try: response.render() except ImmediateHttpResponse as e: return HttpResponseRedirect(e.response) return response 

La razón por la que no puede capturar los errores de representación en la vista es que, aunque la respuesta se crea en la vista, BaseHandler , que maneja todos los errores de manera apropiada. El inconveniente de la solución anterior es que representará la plantilla dos veces por solicitud.

La única otra manera de detectar su error personalizado es personalizar el BaseHandler (o su derivado, como un WSGIHandler ), que obviamente eliminaría ese problema de doble representación.

Digamos que estás usando wsgi , como probablemente deberías 🙂 puedes hacer algo así:

 import django from django.utils import six from django.core.handlers.wsgi import WSGIHandler as DjangoWSGIHandler from my_app.exceptions import ImmediateHttpResponse class WSGIHandler(DjangoWSGIHandler): def handle_uncaught_exception(self, request, resolver, exc_info): (type, value, traceback) = exc_info if type is not None and issubclass(type, ImmediateHttpResponse): six.reraise(*exc_info) return super(WSGIHandler, self).handle_uncaught_exception( request, resolver, exc_info) def get_wsgi_application(): django.setup() return WSGIHandler() 

Ahora puedes usar esta función en wsgi.py :

 application = get_wsgi_application()