Aller au contenu

Middleware

🌐 Traduction par IA et humains

Cette traduction a Ă©tĂ© rĂ©alisĂ©e par une IA guidĂ©e par des humains. đŸ€

Elle peut contenir des erreurs d'interprĂ©tation du sens original, ou paraĂźtre peu naturelle, etc. đŸ€–

Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.

Version anglaise

Vous pouvez ajouter des middlewares aux applications FastAPI.

Un « middleware » est une fonction qui agit sur chaque requĂȘte avant qu’elle 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 qu’elle soit traitĂ©e par le reste de l’application (par un chemin d'accĂšs).
  • Puis il rĂ©cupĂšre la rĂ©ponse gĂ©nĂ©rĂ©e par l’application (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.

Détails techniques

Si vous avez des dĂ©pendances avec yield, le code de sortie s’exĂ©cutera aprĂšs le middleware.

S’il y avait des tĂąches d’arriĂšre-plan (prĂ©sentĂ©es dans la section TĂąches d’arriĂšre-plan, que vous verrez plus tard), elles s’exĂ©cuteront aprĂšs tous les middlewares.

Créer un middleware

Pour crĂ©er un middleware, utilisez le dĂ©corateur @app.middleware("http") au-dessus d’une 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.
import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Astuce

Gardez Ă  l’esprit 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)) en utilisant le paramĂštre expose_headers documentĂ© dans la documentation CORS de Starlette.

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 :

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Astuce

Ici, nous utilisons time.perf_counter() au lieu de time.time() car cela peut ĂȘtre plus prĂ©cis pour ces cas d’usage. đŸ€“

Ordre d’exĂ©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 l’application, 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 s’exĂ©cute en premier.

Sur le chemin de la rĂ©ponse, il s’exĂ©cute en dernier.

Par exemple :

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

Cela aboutit Ă  l’ordre d’exĂ©cution suivant :

  • RequĂȘte : MiddlewareB → MiddlewareA → route

  • RĂ©ponse : route → MiddlewareA → MiddlewareB

Ce comportement d’empilement garantit que les middlewares s’exĂ©cutent dans un ordre prĂ©visible et contrĂŽlable.

Autres middlewares

Vous pouvez en lire davantage sur d’autres middlewares dans le Guide de l’utilisateur avancĂ© : Middleware avancĂ©.

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