יצירה באמצעות POST
חלק מהיחידה ממשקי API של JSON במסלול ה-Django של Coddy. שיעור 5 מתוך 19.
תוכניות יכולות לקרוא את המשימות שלך, אבל לא להוסיף משימה. כדי ליצור משימה, תוכנית שולחת בקשת POST לכתובת של הרשימה, כשהמשימה נמצאת בפורמט JSON בתוך ה־body של הבקשה — הנתונים שנשלחים איתה. טופס ממלא את 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 Created ואת האובייקט החדש, כדי שהתוכנית תוכל ללמוד את ה־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
תרגלו בעצמכם: Django אונליין