HOWTO · Django

Créer une réponse JSON dans Django

Apprenez à créer une réponse JSON dans Django.

Sur cette page

Utilisez le JsonResponse de Django pour renvoyer depuis une vue des données sérialisables en JSON. Par défaut, il accepte un dictionnaire ; vous pouvez aussi lui transmettre une liste avec safe=False. Pour les instances de modèle ou un QuerySet, choisissez d’abord les champs que votre API doit exposer et donnez-leur la forme voulue. Les exemples ci-dessous couvrent les vues fonctionnelles et les vues basées sur des classes, les réponses sous forme de liste, la conversion de modèles et l’option de niveau inférieur HttpResponse.

Renvoyer un objet JSON avec le JsonResponse de Django

Un dictionnaire est l’argument habituel de JsonResponse. Django le sérialise et définit le type de contenu de la réponse sur JSON ; une vue peut donc le renvoyer directement. Voici une petite structure de données utilisable avec les deux styles de vue :

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import json

data = {"name": "Ada", "active": True}
print(json.dumps(data, separators=(",", ":")))

Résultat :

{"name":"Ada","active":true}

Importez JsonResponse depuis django.http. Une vue fonctionnelle peut être définie ainsi : def profile(request): return JsonResponse({"name": "Ada", "active": True}). Pour une vue basée sur une classe, importez également View depuis django.views et définissez class ProfileView(View): get = lambda self, request: JsonResponse({"name": "Ada", "active": True}). Ces modèles de vue propres à Django nécessitent un projet configuré ; l’exemple de la bibliothèque standard ci-dessus illustre la structure des données JSON, et non une requête ou une réponse Django.

Le dictionnaire utilisé par défaut favorise une réponse structurée autour de clés explicites et facile à faire évoluer. Par exemple, une API peut renvoyer aujourd’hui {"name": "Ada", "active": True} et ajouter une autre clé plus tard sans modifier le type de la valeur racine. Veillez à ce que les valeurs soient sérialisables en JSON : les chaînes de caractères, les nombres, les booléens, None, les listes et les dictionnaires sont des choix courants.

Renvoyer un tableau JSON avec JsonResponse

Une liste est également une valeur JSON valide, mais JsonResponse attend un dictionnaire, sauf indication contraire. Définissez safe=False lorsque la valeur racine est une liste :

return JsonResponse(["Django", "Python"], safe=False)

Utilisez cette forme lorsque la réponse est elle-même une collection. Si les clients ont besoin de métadonnées, comme un nombre d’éléments ou des informations de pagination, renvoyez plutôt un dictionnaire contenant la liste, par exemple {"items": ["Django", "Python"], "count": 2}. safe=False modifie la forme autorisée pour la valeur racine ; il ne rend pas pour autant les objets Python quelconques sérialisables.

Convertir les données de modèle et de QuerySet avant de renvoyer du JSON

Une instance de modèle Django et un QuerySet ne sont pas automatiquement sérialisables en JSON. Choisissez les champs à inclure dans la réponse publique et convertissez chaque enregistrement en valeurs Python ordinaires avant de transmettre le résultat à JsonResponse. Vous éviterez ainsi d’exposer accidentellement des champs internes du modèle.

Par exemple, une vue peut récupérer un objet Blog et plusieurs blogs, puis construire explicitement les données à renvoyer :

one = Blog.objects.get(pk=1)

many = Blog.objects.all()

one_data = {"title": one.title, "likes": one.likes}

many_data = [{"title": blog.title, "likes": blog.likes} for blog in many]

return JsonResponse({"blog": one_data, "blogs": many_data})

Cet exemple de mise en forme est ciblé et ne constitue pas une vue complète : il suppose que le modèle Blog et sa base de données sont configurés. Si vous devez inclure une image, une date, un objet associé ou un autre champ non primitif, convertissez-le délibérément en chaîne, nombre, booléen, liste ou dictionnaire conformément au contrat de l’API. Pour des besoins de sérialisation plus importants ou complexes, les sérialiseurs de Django constituent une autre option ; consultez la documentation de Django sur la sérialisation.

Construire manuellement du JSON avec HttpResponse

Utilisez HttpResponse lorsque vous devez maîtriser vous-même l’étape de sérialisation. Importez json et HttpResponse, encodez avec json.dumps une valeur Python compatible avec JSON, puis définissez content_type sur application/json :

import json

from django.http import HttpResponse

return HttpResponse(json.dumps({"name": "Ada"}), content_type="application/json")

Cette méthode de niveau inférieur produit une réponse JSON si la valeur fournie peut être encodée. Pour les dictionnaires et les listes ordinaires, JsonResponse est généralement plus clair, car il se charge de l’encodage JSON et du type de contenu. Comme avec JsonResponse, convertissez d’abord les instances de modèle et les résultats de QuerySet en une structure explicitement compatible avec JSON.