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.
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_nextqui recevra larequesten paramĂštre.- Cette fonction transmettra la
requestau chemin d'accĂšs correspondant. - Puis elle renverra la
responsegénérée par le chemin d'accÚs correspondant.
- Cette fonction transmettra la
- Vous pouvez ensuite modifier la
responseavant 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.