Menu
CoddyTech

الإنشاء باستخدام POST

جزء من قسم واجهات API بصيغة JSON في رحلة Django على Coddy. الدرس 5 من 19.

يمكن للبرامج قراءة مهامك، لكنها لا تستطيع إضافة مهمة. لإنشاء مهمة، يرسل البرنامج طلب POST إلى عنوان URL الخاص بالقائمة، ويضع المهمة بصيغة JSON في متن الطلب، أي البيانات التي تنتقل معه. يملأ النموذج request.POST، لكن JSON لا يفعل ذلك. اقرأ المتن الخام، request.body، وحوّله إلى Python باستخدام json.loads.

يمكن لعنوان URL واحد أن يؤدي مهمتين، ويُختار بينهما باستخدام request.method. يعيد هذا العرض فقط ما أُرسل إليه:

import json


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 تم الإنشاء، ويعيد الكائن الجديد، حتى يعرف البرنامج قيمة id الخاصة به.

لا يرسل شريط العنوان إلا طلبات GET، لذا جرّب إرسال طلب POST من علامة التبويب Shell. يرسل Client الاختباري في Django طلبًا إلى موقعك من Python، وتقرأ .json() الاستجابة. تطبعها Shell على هيئة قاموس Python: 'done': False، وليس false في JSON.

challenge icon

التحدي

متوسط

دع البرامج تنشئ مهمة.

  1. في tasks/views.py، أضف import json. في بداية task_list، عند استخدام POST، أنشئ المهمة من title وpriority في نص JSON (والقيمة الافتراضية normal).
  2. أعِد المهمة الجديدة باستخدام task_to_dict والحالة 201. أبقِ شيفرة GET أدناه.

شغّل السطر أدناه في علامة التبويب Shell: سيطبع Pay rent بالأولوية normal.

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