Tworzenie za pomocą POST
Część sekcji API JSON ścieżki Django w Coddy. Lekcja 5 z 19.
Programy mogą odczytywać Twoje zadania, ale nie mogą dodawać nowych. Aby utworzyć zadanie, program wysyła żądanie POST na adres URL listy, przekazując zadanie jako JSON w body żądania, czyli danych, które są wraz z nim przesyłane. Formularz wypełnia request.POST; JSON tego nie robi. Odczytaj surowe body, request.body, i przekształć je w obiekt Pythona za pomocą json.loads.
Jeden adres URL może pełnić dwie funkcje, zależnie od request.method. Ten widok tylko zwraca to, co do niego wysłano:
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"})Widok, który tworzy coś nowego, odpowiada kodem 201 Created i nowym obiektem, dzięki czemu program poznaje jego id.
Pasek adresu wysyła tylko żądania GET, więc wypróbuj żądanie POST w karcie Shell. Testowy Client Django wysyła żądanie do Twojej witryny z poziomu Pythona, a .json() odczytuje odpowiedź. Shell wyświetla ją jako słownik Pythona: 'done': False, a nie jako false w JSON-ie.
Wyzwanie
ŚredniPozwól programom tworzyć zadanie.
- W pliku
tasks/views.pydodajimport json. Na początkutask_list, dla żądaniaPOST, utwórz zadanie na podstawie póltitleipriorityz treści JSON (domyślnienormal). - Odpowiedz nowym zadaniem zwróconym przez
task_to_dicti statusem201. Pozostaw poniższy kod GET.
Uruchom poniższy wiersz na karcie Shell: wypisuje Pay rent z priorytetem normal.
from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())Spróbuj swoich sił
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))
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji API JSON
2Odczytywanie żądań
Filtrowanie za pomocą zapytaniaTworzenie za pomocą POST5Projekt: Porządkowanie zadań
Projekt: PriorytetyProjekt: Usuwanie ukończonych zadańPoćwicz samodzielnie: Edytor online Django