Menu
CoddyTech

יצירה באמצעות 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.

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

תרגלו בעצמכם: Django אונליין