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.
Défi
FacileAjoute un point de terminaison pour une tâche.
- Dans
tasks/views.py, ajoutetask_detail(request, pk). Il renvoietask_to_dict(task)au format JSON. Lorsqu’aucune tâche ne possède cet identifiant, renvoie le statut404et{"error": "Task not found"}. - Dans
tasks/urls.py, ajoute la route"api/tasks/<int:pk>/"nomméetask_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)
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