الإنشاء باستخدام POST
جزء من قسم واجهات API بصيغة JSON في رحلة Django على Coddy. الدرس 5 من 19.
يمكن للبرامج قراءة مهامك، لكنها لا تستطيع إضافة مهمة. لإنشاء مهمة، يرسل البرنامج طلب POST إلى عنوان URL الخاص بالقائمة، وتكون المهمة بصيغة JSON في body الطلب، أي البيانات التي تنتقل معه. يملأ النموذج request.POST، أما JSON فلا يفعل ذلك. اقرأ النص الخام للطلب، request.body، وحوّله إلى Python باستخدام json.loads.
يمكن لعنوان URL واحد أن يؤدي وظيفتين، ويُختار بينهما باستخدام request.method. هذا العرض يردّ فقط بما أُرسل إليه:
def echo(request):
if request.method == "POST":
data = json.loads(request.body)
return JsonResponse({"you_sent": data})
return JsonResponse({"hint": "Send me a POST"})يردّ العرض الذي ينشئ شيئًا بالرمز 201 Created مع الكائن الجديد، لكي يتعرّف البرنامج على id الخاص به. يُقرأ المفتاح الذي قد يحذفه البرنامج باستخدام قيمة افتراضية: data.get("colour", "black").
التحدي
متوسطدع البرامج تنشئ مهام باستخدام POST /api/tasks/:
- اقرأ متن JSON، مثل
{"title": "Pay rent", "priority": "high"}، وأنشئ المهمة. إذا لم تُحدَّدpriority، فستكون قيمتها"normal". - أعِد المهمة الجديدة وحالة
201. - يواصل GET عرض المهام وتصفيتها.
لا يرسل شريط العناوين سوى GET. اضغط على تشغيل، ثم اكتب هذا في تبويب Shell: from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())
جرّب بنفسك
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.all()
done = request.GET.get("done")
if done == "true":
tasks = tasks.filter(done=True)
elif done == "false":
tasks = tasks.filter(done=False)
return JsonResponse([task_to_dict(task) for task in tasks], safe=False)
def task_detail(request, pk):
task = Task.objects.filter(pk=pk).first()
if task is None:
return JsonResponse({"error": "Task not found"}, status=404)
return JsonResponse(task_to_dict(task))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات API بصيغة JSON
2قراءة الطلبات
التصفية باستخدام استعلامالإنشاء باستخدام POSTتدرّب بنفسك: Playground لـ Django