Wenn Sie in Django entwickeln, möchten Sie oft eine benutzerdefinierte 404-Seite anzeigen, indem Sie Code wie raise Http404("Seite nicht gefunden.") verwenden.
In diesem Artikel werden wir Ursachen für 404-Fehler, Methoden zur Verbindung von Vorlagen und den Umgang mit 403/500-Fehlern praktisch aufbereiten.

Illustration der benutzerdefinierten 404-Fehlerseite für Django


1. Häufige Methoden zur Auslösung von 404-Fehlern

Ich habe die Fälle, in denen in Django ein 404-Fehler auftritt, klassifiziert, und ich denke, die folgenden vier Möglichkeiten kommen in Betracht.

1. raise Http404("Beschreibung")

Dies ist die grundlegendste Methode, um ausdrücklich einen 404-Fehler auszulösen.

from django.http import Http404

def my_view(request):
    if not condition:
        raise Http404("Seite nicht gefunden.")

2. get_object_or_404()

Eine häufig verwendete Kurzfunktion in Django. Sie löst automatisch 404 aus, wenn das Objekt nicht vorhanden ist.

from django.shortcuts import get_object_or_404

post = get_object_or_404(Post, pk=pk)

3. Model.objects.get() mit anschließender Ausnahmebehandlung

In diesem Fall müssen Sie auch manuell einen 404 auslösen.

from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist

try:
    post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
    raise Http404("Beitrag nicht gefunden.")

4. Wenn URLConf oder View nicht existiert

Im Gegensatz zu den Punkten 1–3 handelt es sich hierbei nicht um einen absichtlich ausgelösten 404-Fehler durch den Entwickler, aber Django löst intern automatisch einen 404-Fehler aus, wenn der Anforderer auf eine nicht existierende URL zugreift.


2. Anpassungsmethoden

Bedingungen

  1. Der Vorlagenname muss 404.html sein.
  2. Die folgenden Einstellungen müssen in settings.py konfiguriert sein:
  3. DEBUG = False
  4. Die Einstellung ALLOWED_HOSTS muss gesetzt sein
  5. Die 404.html Vorlage muss an einem Ort sein, an dem Django sie finden kann.

Vorlagenstandorte

Ort Beschreibung
Projektstamm/templates/404.html Der allgemeinste und stabilste Ort
Appname/templates/404.html Machbar, aber benötigt APP_DIRS = True
Appname/templates/Appname/errors/404.html Wird nicht automatisch erkannt, Handler404-Einstellung erforderlich

Beispiel für die manuelle Verbindung über handler404

# views.py
def custom_404_view(request, exception):
    return render(request, 'myapp/errors/404.html', status=404)

# urls.py
handler404 = 'myapp.views.custom_404_view'

3. Können auch 403 und 500 Fehler angepasst werden?

✔ Django ermöglicht die Anpassung von Vorlagen für Folgendes neben 404:

Fehlercode Standardvorlagenname Beschreibung
403 403.html Keine Berechtigung (Permission Denied)
404 404.html Seite nicht gefunden (Not Found)
500 500.html Interner Serverfehler (Internal Server Error)
400 400.html Ungültige Anfrage (Bad Request)

✔ Grundvoraussetzungen sind identisch

  • DEBUG = False ist erforderlich, damit die Vorlage angewendet wird.
  • Die Vorlage muss unter TEMPLATES['DIRS'] oder APP_DIRS=True existieren.
  • Bei Bedarf können handler403, handler400, handler500 manuell registriert werden, um sie mit bestimmten Ansichten zu verbinden.

Zusammenfassung

Posten Inhalt
raise Http404 verwenden Automatische Renderung der 404.html Vorlage
get_object_or_404() Automatisch 404, wenn das Objekt nicht vorhanden ist
Vorlagenname Muss auf jeden Fall feste Namen wie 404.html, 403.html verwenden
Verzeichnisbedingungen Innerhalb von TEMPLATES['DIRS'] oder APP_DIRS sein
DEBUG-Bedingungen Benutzervorlagen werden nur angewendet, wenn DEBUG = False ist
Erweiterte Nutzung Können bestimmte Views über handler404, handler500 verbunden werden