Menu
CoddyTech

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.

challenge icon

Görev

Orta

Programların bir görev oluşturmasını sağlayın.

  1. tasks/views.py dosyasına import json ekleyin. task_list işlevinin başında, POST isteği için JSON gövdesindeki title ve priority değerlerinden (varsayılan normal) görevi oluşturun.
  2. task_to_dict işlevinden yeni görevi ve 201 durum 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))
quiz iconKendini test et

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

Kendi başına pratik yap: Django playground