Saltar al contenido

Middleware Avanzado

En el tutorial principal leíste cómo añadir Custom Middleware a tu aplicación.

Y luego también leíste cómo manejar CORS con el CORSMiddleware.

En esta sección veremos cómo usar otros middlewares.

Añadir middlewares ASGI

Como FastAPI está basado en Starlette e implementa la especificación ASGI, puedes usar cualquier middleware ASGI.

Un middleware no tiene que estar hecho para FastAPI o Starlette para funcionar, siempre y cuando siga la especificación ASGI.

En general, los middlewares ASGI son clases que esperan recibir una app ASGI como primer argumento.

Así que, en la documentación de middlewares ASGI de terceros probablemente te dirán que hagas algo como:

from unicorn import UnicornMiddleware

app = SomeASGIApp()

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

Pero FastAPI (en realidad Starlette) proporciona una manera más simple de hacerlo que asegura que los middlewares internos manejen los errores del servidor y los custom exception handlers funcionen correctamente.

Para eso, usas app.add_middleware() (como en el ejemplo de CORS).

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

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

app.add_middleware() recibe una clase de middleware como primer argumento y cualquier argumento adicional que se pase al middleware.

Middlewares integrados

FastAPI incluye varios middlewares para casos de uso comunes, veremos a continuación cómo usarlos.

Detalles Técnicos

Para los próximos ejemplos, también podrías usar from starlette.middleware.something import SomethingMiddleware.

FastAPI proporciona varios middlewares en fastapi.middleware solo como una conveniencia para ti, el desarrollador. Pero la mayoría de los middlewares disponibles vienen directamente de Starlette.

HTTPSRedirectMiddleware

Fuerza que todas las requests entrantes sean https o wss.

Cualquier request entrante a http o ws será redirigida al esquema seguro en su lugar.

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

Fuerza que todas las requests entrantes tengan un encabezado Host configurado correctamente, para proteger contra ataques de 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"}

Los siguientes argumentos son soportados:

  • allowed_hosts - Una lista de nombres de dominio que deberían ser permitidos como hostnames. Los dominios wildcard como *.example.com son soportados para matching de subdominios. Para permitir cualquier hostname usa allowed_hosts=["*"] u omite el middleware.
  • www_redirect - Si se establece a True, las requests a versiones non-www de los hosts permitidos serán redirigidas a sus contrapartes www. Por defecto es True.

Si una request entrante no se valida correctamente, se enviará una response 400.

GZipMiddleware

Maneja responses GZip para cualquier request que incluya "gzip" en el encabezado Accept-Encoding.

El middleware manejará tanto responses estándar como 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"

Los siguientes argumentos son soportados:

  • minimum_size - No aplicar GZip a responses que sean más pequeñas que este tamaño mínimo en bytes. Por defecto es 500.
  • compresslevel - Usado durante la compresión GZip. Es un entero que va de 1 a 9. Por defecto es 9. Un valor más bajo resulta en una compresión más rápida pero archivos más grandes, mientras que un valor más alto resulta en una compresión más lenta pero archivos más pequeños.

Otros middlewares

Hay muchos otros middlewares ASGI.

Por ejemplo:

Para ver otros middlewares disponibles revisa la documentación de Middleware de Starlette y la ASGI Awesome List.