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.
Aufgabe
MittelLass Programme eine Aufgabe erstellen.
- Füge in
tasks/views.pyimport jsonhinzu. Erstelle am Anfang vontask_listbei einemPOSTdie Aufgabe anhand vontitleundpriorityaus dem JSON-Body (normalals Standardwert). - Antworte mit der neuen Aufgabe aus
task_to_dictund dem Status201. 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))
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in JSON-APIs
2Anfragen lesen
Mit einer Query filternMit POST erstellen5Projekt: Arbeit sortieren
Projekt: PrioritätenProjekt: Erledigte Aufgaben löschenÜbe selbstständig: Django-Playground