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.
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
- Der Vorlagenname muss
404.html
sein. - Die folgenden Einstellungen müssen in
settings.py
konfiguriert sein: DEBUG = False
- Die Einstellung
ALLOWED_HOSTS
muss gesetzt sein - 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']
oderAPP_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 |
Add a New Comment