POST ile Oluşturma
Coddy'nin Django Journey'sinin JSON API'leri bölümünün bir parçası. Ders 5 / 19.
Programlar görevlerinizi okuyabilir ancak görev ekleyemez. Bir görev oluşturmak için program, görev JSON olarak isteğin gövdesinde (istekle birlikte gönderilen veriler) olacak şekilde listenin URL'sine POST isteği gönderir. Bir form request.POST alanını doldurur; JSON doldurmaz. Ham gövdeyi, request.body değerini okuyun ve json.loads ile Python'a dönüştürün.
Tek bir URL, request.method ile seçilen iki işi yapabilir. Bu görünüm yalnızca kendisine gönderileni geri döndürür:
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"})Bir şey oluşturan görünüm, 201 Created yanıtını ve yeni nesneyi döndürür; böylece program nesnenin id değerini öğrenir.
Adres çubuğu yalnızca GET gönderir; bu nedenle Shell sekmesinden POST isteği göndereceksiniz. Django'nun test Client nesnesi Python'dan sitenize bir istek gönderir ve .json() yanıtı okur. Shell bunu bir Python sözlüğü olarak yazdırır: 'done': False; JSON'daki false değil.
Görev
OrtaProgramların bir görev oluşturmasını sağlayın.
tasks/views.pydosyasınaimport jsonekleyin.task_listişlevinin başında,POSTisteği için JSON gövdesindekititleveprioritydeğerlerinden (varsayılannormal) görevi oluşturun.task_to_dictişlevinden yeni görevi ve201durum kodunu döndürün. Aşağıdaki GET kodunu koruyun.
Aşağıdaki satırı Shell sekmesinde çalıştırın: bu satır, önceliği normal olan Pay rent görevini yazdırır.
from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())Kendin dene
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))
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
JSON API'leri bölümündeki tüm dersler
2İstekleri Okuma
Sorguyla FiltrelemePOST ile OluşturmaKendi başına pratik yap: Django playground