Gestion des Requêtes et Réponses dans Django REST Framework

Dans Django REST Framework, les vues basées sur APIView transforment la requête HTTP brute en un objet Request enrichi, fournissant une interface cohérente pour accéder aux données et appliquer des traitements tels que l'authentification ou la négociation de contenu.

Enrichissement de l'objet Requête

Lors de l'initialisation d'une vue, la méthode as_view instancie une nouvelle requête via la classe Request, en encapsulant la requête originale ainsi que plusieurs composants configurables :

# Exemple d'instanciation dans une vue
requete_enrichie = Request(
    requete_brute=requete_initiale,
    parseurs=self._charger_parseurs(),
    authenticateurs=self._recuperer_authenticateurs(),
    negociateur=self._obtenir_negociateur(),
    contexte=self._construire_contexte(requete_initiale)
)

Propriétés et Méthodes de l'objet Request

Le constructeur de Request conserve la requête d'origine et intègre les gestionnaires fournis :

def __init__(self, requete_source, parseurs=None, authenticateurs=None,
             negociateur=None, contexte_parseur=None):
    self._requete_d_origine = requete_source
    self._parseurs_disponibles = parseurs or ()
    self._authenticateurs_actifs = authenticateurs or ()
    self._negociateur_de_contenu = negociateur or self._negociateur_par_defaut()
    self._contexte_pour_le_parseur = contexte_parseur
  • _requete_d_origine : référence à l'objet requête initial.
  • __getattr__ : déléguer les attributs manquants vers la requête d'origine. ``` def getattr(self, attribut): try: return getattr(self._requete_d_origine, attribut) except AttributeError: raise AttributeError(f"'{type(self).name}' n'a pas d'attribut '{attribut}'")
  • data : données du corps de la requête parsées, retournées sous forme de dictionnaire ou QueryDict.
  • query_params : paramètres d'URL extraits et convertis en dictionnaire.
  • user et auth : attributs liés à l'authentification, calculés à la première requête puis mis en cache.

Configuration des Parseurs de Données

Pour restreindre le format d'entrée des requêtes, il est possible de spécifier les parseurs au niveau local ou global.

Configuration Locale

Dans la définition de la vue, on indique explicitement les parseurs acceptés :

from rest_framework.parsers import JSONParser

class VueLivres(APIView):
    parseurs_autorises = [JSONParser]
    # Cette vue n'acceptera que les données au format JSON

Configuration Globale

Dans le fichier settings.py, on définit les parseurs par défaut pour l'ensemble du projet :

PARAMETRES_DRF = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
    ],
}

Une configuration locale prévaut sur la configuration globale ; ainsi, une vue spécifique peut déroger aux règles générales.

Construction de la Réponce

La classe Response de DRF encapsule les données de sortie et gère la négociation de contenu pour renvoyer une réponse adoptée au client.

Paramètres de l'objet Response

Paramètre Description
donnees Contenu à sérialiser (dictionnaire, liste, ou instance de sérialiseur).
statut Code de statut HTTP (ex. : 200, 404).
en_tetes En-têtes HTTP personnalisés à inclure dans la réponse.
type_contenu Format MIME de la réponse (géré automatiquement par défaut).

Formats de Réponse Supportés

DRF prend en charge deux rendus principaux : un format JSON brut et un format HTML enrichi pour la navigation dans un navigateur. La sélection se fait automatiquement en fonction du type de client (navigateur ou API). Pour forcer un format, on peut configurer les rendus :

# Configuration locale dans une vue
from rest_framework.renderers import JSONRenderer

class VueArticles(APIView):
    rendus_actifs = [JSONRenderer]
    # Force la réponse en JSON, même pour les navigateurs

# Configuration globale dans settings.py
PARAMETRES_DRF = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

Les paramètres globaux définis dans rest_framework.settings.DEFAULTS servent de base lorsque aucune configuration spécifique n'est fournie.

Étiquettes: Django REST Framework Python API REST Requêtes HTTP Réponses JSON

Publié le 15 juin à 05h45