10

Vorrei restituire 410 errori per alcune mie pagine Django invece di restituire 404s. Fondamentalmente, invece di chiamare raise Http404('some error message'), mi piacerebbe invece chiamare il collegamento raise Http410('some error message').Come aumentare un errore 410 in Django

Sono confuso, perché in django.http, la funzione Http404 è semplicemente:

class Http404(Exception): 
    pass 

Quindi, se io faccio la stessa cosa e creare il mio Http410 funzione, vorrei assumere che sarebbe simile:

class Http410(Exception): 
    pass 

Tuttavia, l'operazione restituisce l'eccezione ma visualizza una pagina di errore di 500. Come posso ricreare la magia dell'eccezione Http404? Dovrei notare, ho bisogno di aumentare l'eccezione dai miei modelli (non le visualizzazioni), quindi non posso semplicemente restituire un HttpResponseGone.

Grazie in anticipo!

Aggiornamento: Sono perfettamente a conoscenza di HttpResponseGone e ho menzionato questo nella mia domanda originale. So già come restituirlo nelle mie opinioni. La mia domanda è: come si fa a sollevare un'eccezione Http 410 in modo simile a come si genera un'eccezione Http 404? Voglio essere in grado di sollevare questa eccezione ovunque, non solo nelle mie opinioni. Grazie!

risposta

16

Django non include un meccanismo per questo, perché andato dovrebbe essere normale flusso di lavoro, non è una condizione di errore, ma se si vuole, non trattarlo come una risposta di ritorno, e in via eccezionale, solo implementare una middleware.

class MyGoneMiddleware(object): 
    def process_exception(self, request, exception): 
     if isinstance(exception, Http410): 
      return HttpResponseGone("Gone!") 
     return None 
+0

Perfetto. Grazie! – Spike

+0

Inoltre, grazie per il tuo commento su quanto andato dovrebbe essere normale flusso di lavoro anziché una condizione di errore. Lo terrò a mente. – Spike

+0

@Spike Qualsiasi motivo per cui non è possibile restituire un oggetto 'HttpResponseGone' invece di sollevare un'eccezione e avere il middleware iniettare l'oggetto, invece? – Santa

22
from django.http import HttpResponse 
return HttpResponse(status=410) 
11

restituire un HttpResponseGone, una sottoclasse di HttpResponse, nel gestore vista.