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 corps de la requête, c’est-à-dire les données qui l’accompagnent. Un formulaire remplit request.POST ; ce n’est pas le cas du JSON. 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é :

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"})

Une vue qui crée quelque chose renvoie 201 Created et le nouvel objet, afin que le programme récupère son id.

La barre d’adresse n’envoie que des requêtes GET ; vous allez donc essayer d’envoyer une requête POST depuis l’onglet Shell. Le Client de test de Django envoie une requête à votre site depuis Python, et .json() lit la réponse. Le Shell l’affiche sous forme de dictionnaire Python : 'done': False, et non sous la forme du false du JSON.

challenge icon

Défi

Moyen

Laissez les programmes créer une tâche.

  1. Dans tasks/views.py, ajoutez import json. Au début de task_list, pour une requête POST, créez la tâche à partir de title et de priority du corps JSON (valeur par défaut : normal).
  2. Renvoyez la nouvelle tâche obtenue avec task_to_dict et le statut 201. Gardez le code GET ci-dessous.

Exécutez la ligne ci-dessous dans l’onglet Shell : elle affiche Pay rent avec la priorité normal.

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