fastapi/docs/fr/docs/tutorial/middleware.md

4.6 KiB
Raw Blame History

Middleware

Vous pouvez ajouter des middlewares aux applications FastAPI.

Un « middleware » est une fonction qui agit sur chaque requête avant quelle ne soit traitée par un chemin d'accès spécifique. Et aussi sur chaque réponse avant son renvoi.

  • Il intercepte chaque requête qui parvient à votre application.
  • Il peut alors faire quelque chose avec cette requête ou exécuter tout code nécessaire.
  • Ensuite, il transmet la requête pour quelle soit traitée par le reste de lapplication (par un chemin d'accès).
  • Puis il récupère la réponse générée par lapplication (par un chemin d'accès).
  • Il peut faire quelque chose avec cette réponse ou exécuter tout code nécessaire.
  • Enfin, il renvoie la réponse.

/// note | Détails techniques

Si vous avez des dépendances avec yield, le code de sortie sexécutera après le middleware.

Sil y avait des tâches darrière-plan (présentées dans la section Tâches darrière-plan{.internal-link target=_blank}, que vous verrez plus tard), elles sexécuteront après tous les middlewares.

///

Créer un middleware

Pour créer un middleware, utilisez le décorateur @app.middleware("http") au-dessus dune fonction.

La fonction de middleware reçoit:

  • La request.
  • Une fonction call_next qui recevra la request en paramètre.
    • Cette fonction transmettra la request au chemin d'accès correspondant.
    • Puis elle renverra la response générée par le chemin d'accès correspondant.
  • Vous pouvez ensuite modifier la response avant de la renvoyer.

{* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *}

/// tip | Astuce

Gardez à lesprit que des en-têtes propriétaires personnalisés peuvent être ajoutés en utilisant le préfixe X-.

Mais si vous avez des en-têtes personnalisés que vous voulez rendre visibles pour un client dans un navigateur, vous devez les ajouter à votre configuration CORS (CORS (Partage des ressources entre origines){.internal-link target=_blank}) en utilisant le paramètre expose_headers documenté dans la documentation CORS de Starlette.

///

/// note | Détails techniques

Vous pourriez aussi utiliser from starlette.requests import Request.

FastAPI le fournit pour votre confort de développeur. Mais cela provient directement de Starlette.

///

Avant et après la response

Vous pouvez ajouter du code à exécuter avec la request, avant que tout chemin d'accès ne la reçoive.

Et aussi après que la response a été générée, avant de la renvoyer.

Par exemple, vous pourriez ajouter un en-tête personnalisé X-Process-Time contenant le temps en secondes nécessaire pour traiter la requête et générer une réponse:

{* ../../docs_src/middleware/tutorial001_py310.py hl[10,12:13] *}

/// tip | Astuce

Ici, nous utilisons time.perf_counter() au lieu de time.time() car cela peut être plus précis pour ces cas dusage. 🤓

///

Ordre dexécution de plusieurs middlewares

Quand vous ajoutez plusieurs middlewares en utilisant soit le décorateur @app.middleware(), soit la méthode app.add_middleware(), chaque nouveau middleware enveloppe lapplication, formant une pile. Le dernier middleware ajouté est le plus externe, et le premier est le plus interne.

Sur le chemin de la requête, le plus externe sexécute en premier.

Sur le chemin de la réponse, il sexécute en dernier.

Par exemple:

app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)

Cela aboutit à lordre dexécution suivant:

  • Requête : MiddlewareB → MiddlewareA → route

  • Réponse : route → MiddlewareA → MiddlewareB

Ce comportement dempilement garantit que les middlewares sexécutent dans un ordre prévisible et contrôlable.

Autres middlewares

Vous pouvez en lire davantage sur dautres middlewares dans le Guide de lutilisateur avancé : Middleware avancé{.internal-link target=_blank}.

Vous verrez comment gérer CORS avec un middleware dans la section suivante.