Gerando Http404
Parte da seção Fundamentos do Django do Journey de Django da Coddy. Lição 9 de 23.
Abra /drinks/mocha/. A rota corresponde, mas DRINKS["mocha"] gera um KeyError, e o site responde com status 500, um erro do servidor. Para quem visita o site, parece que ele não está funcionando.
A resposta correta é 404: essa página não existe. Uma view indica isso gerando Http404. O café tem doze mesas, então a view table pode recusar /table/40/:
from django.http import Http404, HttpResponse
def table(request, number):
if number > 12:
raise Http404(f"There is no table {number}")
...raise, não return: Http404 é uma exceção, e o Django a transforma na página 404 habitual. Retornar HttpResponse("No such page") exibe essas palavras com status 200, o que informa aos navegadores e mecanismos de busca que a página existe.Desafio
FácilFaça a view drink gerar Http404 quando o slug não estiver em DRINKS. /drinks/latte/ continua funcionando.
Pressione Executar: a prévia abre /drinks/mocha/, que agora mostra a página 404 com sua mensagem.
Experimente você mesmo
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 as lições de Fundamentos do Django
1Seu Primeiro Site com Django
Olá, DjangoUma Segunda Página4Layouts e Arquivos Estáticos
Herança de TemplatesUm Título para Cada Página2URLs Dinâmicas
Conversores de caminhoUma página para cada bebidaStrings de consultaGerando Http404Pratique por conta própria: Playground de Django