Menu
CoddyTech

Créer avec POST

Fait partie de la section API JSON du Journey Django de Coddy. Leçon 5 sur 19.

Les programmes peuvent lire vos tâches, mais pas en ajouter. Pour en créer une, un programme envoie une requête POST à l’URL de la liste, avec la tâche au format JSON dans le body de la requête, c’est-à-dire les données qui l’accompagnent. Un formulaire remplit request.POST ; le JSON, non. Lisez le corps brut, request.body, et convertissez-le en Python avec json.loads.

Une URL peut remplir deux fonctions, selon request.method. Cette vue se contente de renvoyer ce qui lui a été envoyé :

def echo(request):
    if request.method == "POST":
        data = json.loads(request.body)
        return JsonResponse({"you_sent": data})
    return JsonResponse({"hint": "Send me a POST"})

Une vue qui crée quelque chose répond 201 Created avec le nouvel objet, afin que le programme récupère son id. Une clé que le programme peut omettre se lit avec une valeur par défaut : data.get("colour", "black").

challenge icon

Défi

Moyen

Laissez les programmes créer des tâches avec POST /api/tasks/ :

  • Lisez le corps JSON, comme {"title": "Pay rent", "priority": "high"}, et créez la tâche. Sans priority, elle reçoit "normal".
  • Répondez avec la nouvelle tâche et le statut 201.
  • GET continue de répertorier et de filtrer les tâches.

La barre d’adresse n’envoie que des requêtes GET. Appuyez sur Run, puis saisissez ceci dans l’onglet Shell : from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de API JSON

Entraînez-vous par vous-même : Playground Django