Middleware Avanzado¶
En el tutorial principal leíste cómo agregar Middleware Personalizado 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.
Agregando 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 que siga la especificación ASGI.
En general, los middlewares ASGI son clases que esperan recibir una aplicación ASGI como primer argumento.
Entonces, en la documentación de middlewares ASGI de terceros probablemente te indicará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 forma más simple de hacerlo que asegura que los middlewares internos manejen errores del servidor y los controladores de excepciones personalizadas funcionen correctamente.
Para eso, usas app.add_middleware()
(como en el ejemplo para 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 le quiera pasar al middleware.
Middlewares integrados¶
FastAPI incluye varios middlewares para casos de uso común, 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 provienen directamente de Starlette.
HTTPSRedirectMiddleware
¶
Impone que todas las requests entrantes deben ser https
o wss
.
Cualquier request entrante a http
o ws
será redirigida al esquema seguro.
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
¶
Impone que todas las requests entrantes tengan correctamente configurado el header Host
, 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"}
Se soportan los siguientes argumentos:
allowed_hosts
- Una list de nombres de dominio que deberían ser permitidos como nombres de host. Se soportan dominios comodín como*.example.com
para hacer coincidir subdominios. Para permitir cualquier nombre de host, usaallowed_hosts=["*"]
u omite el middleware.
Si una request entrante no se valida correctamente, se enviará un response 400
.
GZipMiddleware
¶
Maneja responses GZip para cualquier request que incluya "gzip"
en el header Accept-Encoding
.
El middleware manejará tanto responses estándar como 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"
Se soportan los siguientes argumentos:
minimum_size
- No comprimir con GZip responses que sean más pequeñas que este tamaño mínimo en bytes. Por defecto es500
.compresslevel
- Usado durante la compresión GZip. Es un entero que varía de 1 a 9. Por defecto es9
. 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 Lista ASGI Awesome.