مهمة واحدة حسب المعرّف
جزء من قسم واجهات API بصيغة JSON في رحلة Django على Coddy. الدرس 3 من 19.
يريد برنامج كان يقرأ القائمة الآن مهمة واحدة على عنوان URL الخاص بها: /api/tasks/1/. يأخذ المسار المعرّف باستخدام <int:pk>، كما فعلت صفحات التفاصيل لديك، وتحول المساعدة task_to_dict(task) في المشروع الأساسي المهمة إلى قاموس.
الجزء الجديد هو التعامل مع مهمة غير موجودة. يستجيب get_object_or_404 بصفحة 404 بتنسيق HTML من Django، ولا يستطيع البرنامج قراءتها، لذا ترسل واجهة API أخطاءها بتنسيق JSON أيضًا، مع رمز الحالة الصحيح، وهو الرقم الذي يوضح نتيجة الطلب: 200 OK، و403 Forbidden، و404 Not Found. تأخذها JsonResponse على هيئة status:
return JsonResponse({"error": "Staff only"}, status=403)للاختيار بين الخطأ والمهمة، ابحث عن الصف من دون إطلاق استثناء: يعيد filter(pk=...).first() الصف، أو None إذا لم يوجد.
التحدي
سهلأضف نقطة نهاية لمهمة واحدة.
- في
tasks/views.py، أضفtask_detail(request, pk). تستجيب بدالةtask_to_dict(task)بصيغة JSON. عندما لا توجد مهمة بهذا المعرّف، استجب بالحالة404وبالقيمة{"error": "Task not found"}. - في
tasks/urls.py، أضف المسار"api/tasks/<int:pk>/"بالاسمtask_detail.
افتح /api/tasks/99/: ستظهر لك القيمة {"error": "Task not found"}.
جرّب بنفسك
from django.http import JsonResponse
from django.shortcuts import render
from .models import Task
def task_to_dict(task):
return {
"id": task.id,
"title": task.title,
"done": task.done,
"priority": task.priority,
}
def home(request):
return render(request, "tasks/home.html", {"tasks": Task.objects.all()})
def stats(request):
data = {
"total": Task.objects.count(),
"done": Task.objects.filter(done=True).count(),
}
return JsonResponse(data)
def task_list(request):
tasks = Task.objects.values("id", "title", "done", "priority")
return JsonResponse(list(tasks), safe=False)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات API بصيغة JSON
تدرّب بنفسك: Playground لـ Django