Menu
CoddyTech

Mit POST erstellen

Teil des Abschnitts JSON-APIs der Django-Journey von Coddy. Lektion 5 von 19.

Programme können deine Aufgaben lesen, aber keine hinzufügen. Um eine Aufgabe zu erstellen, sendet ein Programm einen POST an die URL der Liste und übermittelt die Aufgabe als JSON im body der Anfrage, also den Daten, die mitgesendet werden. Ein Formular füllt request.POST; JSON nicht. Lies den rohen Inhalt des Bodys, request.body, und wandle ihn mit json.loads in Python um.

Eine URL kann zwei Aufgaben übernehmen, je nach request.method. Diese View gibt nur wieder, was an sie gesendet wurde:

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"})

Eine View, die etwas erstellt, antwortet mit 201 Created und dem neuen Objekt, damit das Programm dessen id erfährt.

Die Adressleiste sendet nur GET, also probierst du einen POST über den Tab „Shell“ aus. Der Django-Test-Client sendet von Python aus eine Anfrage an deine Website, und .json() liest die Antwort. Die Shell gibt sie als Python-Wörterbuch aus: 'done': False, nicht als JSON-false.

challenge icon

Aufgabe

Mittel

Lass Programme eine Aufgabe erstellen.

  1. Füge in tasks/views.py import json hinzu. Erstelle am Anfang von task_list bei einem POST die Aufgabe anhand von title und priority aus dem JSON-Body (normal als Standardwert).
  2. Antworte mit der neuen Aufgabe aus task_to_dict und dem Status 201. Behalte den GET-Code darunter bei.

Führe die folgende Zeile im Tab „Shell“ aus: Sie gibt Pay rent mit der Priorität normal aus.

from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in JSON-APIs

Übe selbstständig: Django-Playground