Lanzar Http404
Parte de la sección Conceptos básicos de Django del Journey de Django de Coddy. Lección 9 de 23.
Abre /drinks/mocha/. La ruta coincide, pero DRINKS["mocha"] genera un KeyError, y el sitio responde con el estado 500, un error del servidor. Para quien lo visita, el sitio parece no funcionar.
La respuesta correcta es 404: esa página no existe. Una vista lo indica generando Http404. La cafetería tiene doce mesas, así que la vista table podría rechazar /table/40/:
from django.http import Http404, HttpResponse
def table(request, number):
if number > 12:
raise Http404(f"There is no table {number}")
...raise, no return: Http404 es una excepción, y Django la convierte en la página 404 habitual. Devolver HttpResponse("No such page") muestra esas palabras con el estado 200, lo que indica a los navegadores y motores de búsqueda que la página existe.Desafío
FácilHaz que la vista drink genere Http404 cuando el slug no esté en DRINKS. /drinks/latte/ sigue funcionando.
Pulsa Ejecutar: la vista previa abre /drinks/mocha/, que ahora muestra la página 404 con tu mensaje.
Pruébalo tú mismo
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.")
Todas las lecciones de Conceptos básicos de Django
1Tu primer sitio con Django
Hola, DjangoUna segunda página4Diseños y archivos estáticos
Herencia de plantillasUn título para cada página2URLs dinámicas
Convertidores de rutaUna página para cada bebidaCadenas de consultaLanzar Http404Practica por tu cuenta: Playground de Django