رفع Http404
جزء من قسم أساسيات Django في رحلة Django على Coddy. الدرس 9 من 23.
افتح /drinks/mocha/. يطابق المسار، لكن DRINKS["mocha"] يثير KeyError، ويستجيب الموقع برمز الحالة 500، أي خطأ في الخادم. بالنسبة إلى الزائر، يبدو موقعك معطّلًا.
الاستجابة الصحيحة هي 404، أي لا توجد صفحة كهذه. تشير طريقة العرض إلى ذلك برفع الاستثناء Http404. للمقهى اثنتا عشرة طاولة، لذا يمكن لطريقة العرض table رفض /table/40/:
from django.http import Http404, HttpResponse
def table(request, number):
if number > 12:
raise Http404(f"There is no table {number}")
...raise، وليس return: إن Http404 استثناء، ويحوّله Django إلى صفحة 404 المعتادة. أما إرجاع HttpResponse("No such page") فيعرض هذه الكلمات برمز الحالة 200، ما يخبر المتصفحات ومحركات البحث بأن الصفحة موجودة.
التحدي
سهلفي menu/views.py، اجعل طريقة العرض drink ترفع Http404 عندما لا يكون المعرّف المختصر ضمن DRINKS.
افتح /drinks/mocha/ لرؤية رسالة 404، ثم /drinks/latte/: ستظل تعمل.
جرّب بنفسك
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.")
جميع دروس أساسيات Django
تدرّب بنفسك: Playground لـ Django