Lever Http404
Fait partie de la section Les bases de Django du Journey Django de Coddy. Leçon 9 sur 23.
Ouvre /drinks/mocha/. La route correspond, mais DRINKS["mocha"] déclenche une KeyError, et le site répond avec le statut 500, une erreur serveur. Pour un visiteur, ton site semble hors service.
La réponse appropriée est 404 : cette page n'existe pas. Une vue l'indique en déclenchant Http404. Le café compte douze tables ; la vue table pourrait donc refuser /table/40/ :
from django.http import Http404, HttpResponse
def table(request, number):
if number > 12:
raise Http404(f"There is no table {number}")
...raise, et non return : Http404 est une exception, et Django la transforme en page 404 habituelle. Renvoyer HttpResponse("No such page") affiche ces mots avec le statut 200, ce qui indique aux navigateurs et aux moteurs de recherche que la page existe.Défi
FacileFais en sorte que la vue drink déclenche Http404 lorsque le slug ne figure pas dans DRINKS. /drinks/latte/ continue de fonctionner.
Appuie sur Run : l’aperçu ouvre /drinks/mocha/, qui affiche maintenant la page 404 avec ton message.
Essayez vous-même
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.")
Toutes les leçons de Les bases de Django
1Votre premier site Django
Bonjour, DjangoUne deuxième page4Mises en page et fichiers statiques
Héritage des templatesUn titre pour chaque page2URLs dynamiques
Convertisseurs de cheminUne page pour chaque boissonChaînes de requêteLever Http404Entraînez-vous par vous-même : Playground Django