2011-10-10 12 views
18

Aparentemente hay dos maneras diferentes de devolver un error 404 en Django: devolviendo un objeto HttpResponseNotFound o levantando una excepción Http404. Mientras uso el primero en mi proyecto, parece que los puntos de vista internos de Django usan principalmente este último. Además del mantra de "La excepción es excepcional", ¿cuál es la diferencia entre ambas formas y cuál debería estar usando?¿Cuál es la diferencia entre devolver un `HttpResponseNotFound` y subir un` Http404` en Django?

Respuesta

14

HttpResponseNotFound es como un HttpResponse normal excepto que envía el código de error 404. Por lo tanto, depende de usted presentar una página 404 adecuada en esa vista, de lo contrario, el navegador mostrará su propio valor predeterminado.

Si se genera una excepción Http404, Django llamará a su propia vista de error 404. En realidad, esto hace poco más que renderizar la plantilla 404.html y enviarla, usando HttpResponseNotFound, de hecho. Pero la conveniencia es que usted está especificando la plantilla (y ver, si lo desea) en un solo lugar.

3

Además de lo que dijo Daniel, generar una excepción Http404 puede ser más flexible ya que le permite generar un 404 p. Ej. desde una función de ayuda más profunda en su pila de llamadas (posiblemente una que normalmente no es HttpResponse) y confíe en la propagación de excepciones de Python en lugar de tener que crear HttpResponseNotFound y volver a pasarla manualmente al lugar donde originalmente estaba creando su respuesta.

0

En voluminoso de lo que dijo Daniel y esmail, como referencia, esto es, literalmente, la definición de HttpResponseNotFound Django (v1.8):

class HttpResponseNotFound(HttpResponse): 
    status_code = 404 

Y por si acaso, la definición de Http404:

class Http404(Exception): 
    pass 
Cuestiones relacionadas