Http404 auslösen
Teil des Abschnitts Django-Grundlagen der Django-Journey von Coddy. Lektion 9 von 23.
Öffne /drinks/mocha/. Die Route passt, aber DRINKS["mocha"] löst einen KeyError aus, und die Website antwortet mit dem Status 500, einem Serverfehler. Für Besucher sieht deine Website defekt aus.
Die richtige Antwort ist 404: Diese Seite gibt es nicht. Eine View signalisiert das, indem sie Http404 auslöst. Das Café hat zwölf Tische, also könnte die table-View /table/40/ ablehnen:
from django.http import Http404, HttpResponse
def table(request, number):
if number > 12:
raise Http404(f"There is no table {number}")
...raise, nicht return: Http404 ist eine Ausnahme, und Django wandelt sie in die übliche 404-Seite um. Wenn du HttpResponse("No such page") zurückgibst, werden die Worte mit dem Status 200 angezeigt. Das signalisiert Browsern und Suchmaschinen, dass die Seite existiert.Aufgabe
EinfachSorge dafür, dass die Ansicht drink Http404 auslöst, wenn der Slug nicht in DRINKS enthalten ist. /drinks/latte/ funktioniert weiterhin.
Klicke auf Run: Die Vorschau öffnet /drinks/mocha/, wo jetzt die 404-Seite mit deiner Nachricht angezeigt wird.
Probier es selbst
from django.http import HttpResponse
DRINKS = {
"espresso": {"name": "Espresso", "price": 2.5, "description": "A short, strong shot of coffee."},
"latte": {"name": "Latte", "price": 3.5, "description": "Espresso with lots of steamed milk."},
"flat-white": {"name": "Flat White", "price": 3.75, "description": "Espresso with a thin layer of silky milk."},
"hot-chocolate": {"name": "Hot Chocolate", "price": 3, "description": "Dark chocolate melted into warm milk."},
}
def home(request):
return HttpResponse("<h1>Welcome to Corner Café</h1><p>Fresh coffee and cake every day.</p>")
def about(request):
return HttpResponse("Corner Café opened in 2026.")
def hours(request):
return HttpResponse("Open every day from 8:00 to 18:00.")
def contact(request):
return HttpResponse("Write to us at hello@cornercafe.example.")
def table(request, number):
return HttpResponse(f"<h1>Table {number}</h1>")
def drink(request, slug):
item = DRINKS[slug]
return HttpResponse(f"<h1>{item['name']}</h1><p>{item['description']}</p>")
def order(request):
size = request.GET.get("size", "medium")
if size not in ["small", "medium", "large"]:
size = "medium"
return HttpResponse(f"You ordered a {size} coffee.")
Alle Lektionen in Django-Grundlagen
1Deine erste Django-Website
Hallo, DjangoEine zweite Seite4Layouts und statische Dateien
Template-VererbungEin Titel für jede SeiteÜbe selbstständig: Django-Playground