2011-10-10 5 views
18

Esistono due modi diversi per restituire un errore 404 in Django: restituendo un oggetto HttpResponseNotFound o sollevando un'eccezione Http404. Mentre sto usando il primo nel mio progetto, sembra che le opinioni interne di Django utilizzino principalmente quest'ultimo. Oltre al mantra "Eccezione è eccezionale", qual è la differenza tra entrambi i modi e quali dovrei usare?Qual è la differenza tra il ritorno di un `HttpResponseNotFound` e il sollevamento di un` Http404` in Django?

risposta

14

Un HttpResponseNotFound è come un normale HttpResponse eccetto che invia il codice di errore 404. Quindi spetta a te rendere una pagina 404 appropriata in quella vista, altrimenti il ​​browser visualizzerà il proprio valore predefinito.

L'innalzamento di un'eccezione Http404 attiverà Django per chiamare la propria visualizzazione di errore 404. In realtà, questo non fa altro che rendere il modello 404.html e inviarlo, in effetti, utilizzando HttpResponseNotFound. Ma la praticità è che stai specificando il modello (e guarda, se vuoi) in un unico posto.

3

In aggiunta a ciò che Daniel ha detto, sollevare un'eccezione Http404 può essere più flessibile in quanto consente di generare un 404 ad es. da una funzione di supporto più profonda nello stack di chiamate (probabilmente di tipo che non restituisce un tipo non HttpResponse) e si basano sulla propagazione delle eccezioni di Python invece di dover creare un HttpResponseNotFound e trasferirlo manualmente nella posizione in cui si stava originariamente elaborando la risposta.

0

In addtion a ciò che ha detto Daniele e Esmail, per riferimento, questo è letteralmente la definizione di HttpResponseNotFound Django (v1.8):

class HttpResponseNotFound(HttpResponse): 
    status_code = 404 

E per buona misura, la definizione di Http404:

class Http404(Exception): 
    pass 
Problemi correlati