Menu
CoddyTech

Une tâche par identifiant

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

Un programme qui lisait la liste veut maintenant une tâche, à sa propre URL : /api/tasks/1/. La route récupère l’identifiant avec <int:pk>, comme le faisaient vos pages de détail, et l’assistant fourni dans le code de départ task_to_dict(task) transforme une tâche en dictionnaire.

La nouveauté, c’est le cas d’une tâche manquante. get_object_or_404 renvoie la page HTML 404 de Django, qu’un programme ne peut pas lire ; une API renvoie donc aussi ses erreurs au format JSON, avec le bon code d’état, le nombre qui indique comment s’est déroulée une requête : 200 OK, 403 Forbidden, 404 Not Found. JsonResponse le prend avec status :

return JsonResponse({"error": "Staff only"}, status=403)

Pour choisir entre l’erreur et la tâche, recherchez la ligne sans déclencher d’exception : filter(pk=...).first() renvoie la ligne, ou None s’il n’y en a pas.

challenge icon

Défi

Facile

Ajoute un point de terminaison pour une tâche.

  1. Dans tasks/views.py, ajoute task_detail(request, pk). Il renvoie task_to_dict(task) au format JSON. Lorsqu’aucune tâche ne possède cet identifiant, renvoie le statut 404 et {"error": "Task not found"}.
  2. Dans tasks/urls.py, ajoute la route "api/tasks/<int:pk>/" nommée task_detail.

Ouvre /api/tasks/99/ : tu vois {"error": "Task not found"}.

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.values("id", "title", "done", "priority")
    return JsonResponse(list(tasks), safe=False)
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