Aller au contenu

Utiliser des middlewares avancés

🌐 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

Dans le tutoriel principal, vous avez vu comment ajouter des middlewares personnalisés à votre application.

Vous avez également vu comment gérer CORS avec le CORSMiddleware.

Dans cette section, nous allons voir comment utiliser d'autres middlewares.

Ajouter des middlewares ASGI

Comme FastAPI est basé sur Starlette et implémente la spécification ASGI, vous pouvez utiliser n'importe quel middleware ASGI.

Un middleware n'a pas besoin d'être conçu pour FastAPI ou Starlette pour fonctionner, tant qu'il suit la spécification ASGI.

En général, les middlewares ASGI sont des classes qui s'attendent à recevoir une application ASGI en premier argument.

Ainsi, dans la documentation de middlewares ASGI tiers, on vous indiquera probablement de faire quelque chose comme :

from unicorn import UnicornMiddleware

app = SomeASGIApp()

new_app = UnicornMiddleware(app, some_config="rainbow")

Mais FastAPI (en fait Starlette) fournit une manière plus simple de le faire, qui garantit que les middlewares internes gèrent les erreurs serveur et que les gestionnaires d'exceptions personnalisés fonctionnent correctement.

Pour cela, vous utilisez app.add_middleware() (comme dans l'exemple pour CORS).

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

app.add_middleware(UnicornMiddleware, some_config="rainbow")

app.add_middleware() reçoit une classe de middleware en premier argument, ainsi que tout argument supplémentaire à transmettre au middleware.

Utiliser les middlewares intégrés

FastAPI inclut plusieurs middlewares pour des cas d'usage courants ; voyons comment les utiliser.

Détails techniques

Pour les prochains exemples, vous pourriez aussi utiliser from starlette.middleware.something import SomethingMiddleware.

FastAPI fournit plusieurs middlewares dans fastapi.middleware simplement pour vous faciliter la vie, en tant que développeur. Mais la plupart des middlewares disponibles viennent directement de Starlette.

HTTPSRedirectMiddleware

Impose que toutes les requêtes entrantes soient soit https, soit wss.

Toute requête entrante en http ou ws sera redirigée vers le schéma sécurisé correspondant.

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}
🤓 Other versions and variants
from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}

TrustedHostMiddleware

Impose que toutes les requêtes entrantes aient un en-tête Host correctement défini, afin de se prémunir contre les attaques de type HTTP Host Header.

from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware

app = FastAPI()

app.add_middleware(
    TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)


@app.get("/")
async def main():
    return {"message": "Hello World"}
🤓 Other versions and variants
from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware

app = FastAPI()

app.add_middleware(
    TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

Les arguments suivants sont pris en charge :

  • allowed_hosts - Une liste de noms de domaine autorisés comme noms d'hôte. Les domaines génériques tels que *.example.com sont pris en charge pour faire correspondre les sous-domaines. Pour autoriser n'importe quel nom d'hôte, utilisez allowed_hosts=["*"] ou omettez le middleware.
  • www_redirect - Si défini à True, les requêtes vers les versions sans www des hôtes autorisés seront redirigées vers leurs équivalents avec www. Valeur par défaut : True.

Si une requête entrante n'est pas valide, une réponse 400 sera envoyée.

GZipMiddleware

Gère les réponses GZip pour toute requête qui inclut « gzip » dans l'en-tête Accept-Encoding.

Le middleware gérera les réponses standard et en streaming.

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)


@app.get("/")
async def main():
    return "somebigcontent"
🤓 Other versions and variants
from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)


@app.get("/")
async def main():
    return "somebigcontent"

Les arguments suivants sont pris en charge :

  • minimum_size - Ne pas compresser en GZip les réponses dont la taille est inférieure à ce minimum en octets. Valeur par défaut : 500.
  • compresslevel - Utilisé pendant la compression GZip. Entier compris entre 1 et 9. Valeur par défaut : 9. Une valeur plus faible entraîne une compression plus rapide mais des fichiers plus volumineux, tandis qu'une valeur plus élevée entraîne une compression plus lente mais des fichiers plus petits.

Autres middlewares

Il existe de nombreux autres middlewares ASGI.

Par exemple :

Pour voir d'autres middlewares disponibles, consultez la documentation des middlewares de Starlette et la liste ASGI Awesome.