Gestion des données entrantes (Fast API)

Dans FastAPI, les données entrantes sont toutes les informations envoyées par le client via une requête HTTP.
FastAPI les reçoit et les convertit automatiquement en types Python, ce qui simplifie beaucoup la gestion des données.


Comment ça fonctionne ?

FastAPI utilise la déclaration de types Python et les modèles Pydantic pour lire et valider les données.
Chaque paramètre d’une fonction endpoint correspond à une source de données :

Sources principales des données entrantes :

  1. Paramètres d’URL

    • Exemple : /users/{user_id}user_id est un paramètre de chemin (Path)

  2. Paramètres de requête (Query)

    • Exemple : /users?active=trueactive est un paramètre de requête (Query)

  3. Corps de la requête (Request Body)

    • Souvent utilisé pour POST ou PUT

    • FastAPI utilise pydantic.BaseModel pour valider automatiquement les données JSON

  4. Fichiers envoyés par le client

    • Accès via File et UploadFile

  5. Cookies et headers HTTP

    • Accès via Cookie, Header ou Depends


Exemple conceptuel

Ici, FastAPI valide automatiquement le JSON, renvoie une erreur si un champ est manquant ou de type incorrect.


Pourquoi c’est important :


Bonnes pratiques pour la gestion des données entrantes

  1. Utiliser Pydantic pour la validation

    • Définir les modèles pour chaque type de données attendu

  2. Sanitisation des données

    • Nettoyer les entrées pour éviter les injections ou attaques XSS

  3. Gestion des erreurs

    • FastAPI renvoie automatiquement 422 si les données ne sont pas valides

    • On peut personnaliser les messages d’erreur si nécessaire

  4. Limiter la taille des fichiers

    • Pour éviter surcharge ou abus

  5. Documentation automatique

    • FastAPI génère automatiquement la documentation Swagger/OpenAPI pour chaque endpoint et chaque paramètre


En résumé, dans FastAPI :

Fonctions :

  • Gestion des données entrantes avec Fast API (exemple)

    Exemple de code :

    from fastapi import FastAPI, Query, Path
    from pydantic import BaseModel
    from typing import Optional
    
    app = FastAPI()
    
    # 1️⃣ Paramètre dynamique dans l'URL
    @app.get("/user/{username}")
    def read_user(username: str = Path(..., title="Nom de l'utilisateur", min_length=1)):
        return {"username": username}
    
    # 2️⃣ Paramètres de requête (query)
    @app.get("/search/")
    def search_items(q: Optional[str] = Query(None, max_length=50), limit: int = 10):
        return {"query": q, "limit": limit}
    
    # 3️⃣ Données JSON avec POST
    class Item(BaseModel):
        name: str
        price: float
        description: Optional[str] = None
    
    @app.post("/items/")
    def create_item(item: Item):
        return {"message": "Article reçu", "item": item}

    Explication du code :

    from fastapi import FastAPI, Query, Path importe FastAPI pour créer l’application, et Query et Path pour gérer les paramètres de requête et les paramètres d’URL.

    from pydantic import BaseModel importe BaseModel pour créer des modèles de données et valider les entrées JSON.

    from typing import Optional permet de définir des paramètres optionnels dans les fonctions.

    app = FastAPI() crée une instance de l’application FastAPI.

    Paramètre dynamique dans l'URL

    @app.get("/user/{username}") définit une route GET qui capture une valeur dans l’URL (exemple : /user/Alice).
    username: str = Path(..., title="Nom de l'utilisateur", min_length=1) indique que le paramètre username est obligatoire, a un titre descriptif et doit avoir au moins 1 caractère.
    return {"username": username} renvoie la valeur capturée sous forme de JSON.

    Paramètres de requête (query)

    @app.get("/search/") définit une route GET avec des paramètres de requête.
    q: Optional[str] = Query(None, max_length=50) définit un paramètre optionnel q pour la recherche, avec une longueur maximale de 50 caractères.
    limit: int = 10 définit un paramètre entier limit avec une valeur par défaut de 10.
    return {"query": q, "limit": limit} renvoie les valeurs reçues sous forme de JSON.

    Données JSON avec POST

    class Item(BaseModel): crée un modèle de données pour valider les entrées JSON.
    Les attributs name: str, price: float et description: Optional[str] = None définissent les champs attendus et leur type.
    @app.post("/items/") définit une route POST pour recevoir des données JSON.
    def create_item(item: Item): transforme automatiquement le JSON envoyé en objet Item.
    return {"message": "Article reçu", "item": item} renvoie une confirmation et les données reçues.