Menu
CoddyTech

الإنشاء باستخدام 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").

challenge icon

التحدي

متوسط

دع البرامج تنشئ مهام باستخدام 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))
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس واجهات API بصيغة JSON

تدرّب بنفسك: Playground لـ Django