الإنشاء باستخدام 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.
التحدي
متوسطدع البرامج تنشئ مهمة.
- في
tasks/views.py، أضفimport json. في بدايةtask_list، عند استخدامPOST، أنشئ المهمة منtitleوpriorityفي نص JSON (والقيمة الافتراضيةnormal). - أعِد المهمة الجديدة باستخدام
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))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات API بصيغة JSON
2قراءة الطلبات
التصفية باستخدام استعلامالإنشاء باستخدام POSTتدرّب بنفسك: Playground لـ Django