2013-05-03 10 views
5

mi piace per sollevare 404 con qualche messaggio di errore in luoghi diversi nello script ad esempio: Http404("some error msg: %s" %msg) Quindi, a mio urls.py ho incluso:Django sollevando 404 con un messaggio

handler404 = Custom404.as_view() 

Qualcuno può dirmi come dovrei gestire l'errore nelle mie opinioni. Sono abbastanza nuovo per Django, quindi un esempio sarebbe di grande aiuto.
Molte grazie in anticipo.

+2

Poiché si esegue l'override di 'handler404', si progetta' 404.html' e si usa 'raise Http404' – karthikr

risposta

4

In generale, l'errore 404 è l'errore "pagina non trovata" - non dovrebbe avere messaggi personalizzabili, semplicemente perché deve essere generato solo quando non viene trovata una pagina.

È possibile restituire un TemplateResponse con parametro di stato impostato su 404

0

Il valore di default 404 conduttore richiama 404.html. Si potrebbe modificare che se non avete bisogno di qualcosa di speciale o può ignorare il gestore di 404 impostando la vista handler404 - see more here

1

è possibile restituire un oggetto HttpResponse pianura con un codice di stato (in questo caso 404)

from django.shortcuts import render_to_response 

def my_view(request): 
    template_context = {} 

    # ... some code that leads to a custom 404 

    return render_to_response("my_template.html", template_context, status=404) 
4

Generalmente non ci dovrebbero essere messaggi personalizzati in 404 errori bu se si desidera implementarlo è possibile farlo usando i middleware django.

Middleware

from django.http import Http404, HttpResponse 


class Custom404Middleware(object): 
    def process_exception(self, request, exception): 
     if isinstance(exception, Http404): 
      # implement your custom logic. You can send 
      # http response with any template or message 
      # here. unicode(exception) will give the custom 
      # error message that was passed. 
      msg = unicode(exception) 
      return HttpResponse(msg, status=404) 

middleware Impostazioni

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'college.middleware.Custom404Middleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

questo farà il trucco. Correggimi se faccio qualcosa di sbagliato. Spero che questo ti aiuti.

2

Sollevare un'eccezione Http404 all'interno di una vista. Di solito si fa quando si rileva un'eccezione DoesNotExist. Per esempio:

from django.http import Http404 

def article_view(request, slug): 
    try: 
     entry = Article.objects.get(slug=slug) 
    except Article.DoesNotExist: 
     raise Http404() 
    return render(request, 'news/article.html', {'article': entry, }) 

Ancora meglio, utilizzare get_object_or_404 shortcut:

from django.shortcuts import get_object_or_404 

def article_view(request): 
    article = get_object_or_404(MyModel, pk=1) 
    return render(request, 'news/article.html', {'article': entry, }) 

Se vuoi personalizzare la risposta predefinita 404 Page not found, mettere il proprio modello chiamato 404.html alla cartella templates.

Problemi correlati