2013-05-03 11 views
5

lubię podnieść 404 z jakimś komunikatem o błędzie w różnych miejscach w skrypcie np Http404("some error msg: %s" %msg) Tak, w moim urls.py I obejmował:Django podnosząc 404 z komunikatem

handler404 = Custom404.as_view() 

Czy ktoś proszę mi powiedzieć jak powinienem radzić sobie z błędem w moich poglądach. Jestem całkiem nowy w Django, więc przykład bardzo by pomógł.
Wielkie dzięki z góry.

+2

Odkąd przejąłeś 'handler404', zaprojektuj' 404.html' i użyj 'podniesienia Http404'' – karthikr

Odpowiedz

4

Ogólnie błąd 404 to błąd "nie znaleziono strony" - nie powinien mieć dostosowywanych komunikatów, ponieważ powinien zostać podniesiony tylko wtedy, gdy strona nie zostanie znaleziona.

Można zwrócić TemplateResponse parametrem stanu ustawiony 404

0

domyślnej 404 handler zwraca 404.html. Można edytować, że jeśli nie trzeba niczego wyjątkowego lub może przesłonić obsługi 404 przez ustawienie widoku handler404 - see more here

1

można powrócić do zwykłego obiektu HttpResponse z kodem stanu (w tym przypadku 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

Generalnie nie powinno być żadnych niestandardowych komunikatów w 404 błędach bu, jeśli chcesz go zaimplementować, możesz to zrobić za pomocą 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 Ustawienia

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', 
) 

to załatwi. Popraw mnie, jeśli robię coś złego. Mam nadzieję że to pomoże.

2

Podniesienie wyjątku Http404 wewnątrz widoku. Zwykle robi się to po złapaniu wyjątku od DoesNotExist. Na przykład:

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, }) 

Jeszcze lepiej użyć 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, }) 

Jeśli chcesz dostosować odpowiedź domyślna 404 Page not found, umieścić swój własny szablon o nazwie 404.html do folderu templates.