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 eine POST-Anfrage an die URL der Liste, wobei die Aufgabe als JSON im body der Anfrage mitgeschickt wird, also den Daten, die mit ihr übertragen werden. Ein Formular füllt request.POST; bei JSON ist das nicht der Fall. Lies den unverarbeiteten Body, request.body, und wandle ihn mit json.loads in Python um.

Eine URL kann zwei Aufgaben übernehmen, je nachdem, was request.method ergibt. Diese View gibt lediglich zurück, was ihr gesendet wurde:

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. Ein Schlüssel, den das Programm weglassen kann, wird mit einem Standardwert gelesen: data.get("colour", "black").

challenge icon

Aufgabe

Mittel

Lass Programme mit POST /api/tasks/ Aufgaben erstellen:

  • Lies den JSON-Body, zum Beispiel {"title": "Pay rent", "priority": "high"}, und erstelle die Aufgabe. Ohne priority erhält sie den Wert "normal".
  • Antworte mit der neuen Aufgabe und dem Status 201.
  • GET listet weiterhin auf und filtert.

Die Adressleiste sendet nur GET. Klicke auf „Ausführen“ und gib dann Folgendes im Tab „Shell“ ein: 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