Middleware¶
Puedes añadir middleware a las aplicaciones de FastAPI.
Un "middleware" es una función que trabaja con cada request antes de que sea procesada por cualquier path operation específica. Y también con cada response antes de devolverla.
- Toma cada request que llega a tu aplicación.
- Puede entonces hacer algo a esa request o ejecutar cualquier código necesario.
- Luego pasa la request para que sea procesada por el resto de la aplicación (por alguna path operation).
- Después toma la response generada por la aplicación (por alguna path operation).
- Puede hacer algo a esa response o ejecutar cualquier código necesario.
- Luego devuelve la response.
Detalles Técnicos
Si tienes dependencias con yield
, el código de salida se ejecutará después del middleware.
Si hubiera alguna tarea en segundo plano (documentada más adelante), se ejecutará después de todo el middleware.
Crear un middleware¶
Para crear un middleware usas el decorador @app.middleware("http")
encima de una función.
La función middleware recibe:
- La
request
. - Una función
call_next
que recibirá larequest
como parámetro.- Esta función pasará la
request
a la correspondiente path operation. - Luego devuelve la
response
generada por la correspondiente path operation.
- Esta función pasará la
- Puedes entonces modificar aún más la
response
antes de devolverla.
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
Consejo
Ten en cuenta que los custom proprietary headers se pueden añadir usando el prefijo 'X-'.
Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS (CORS (Cross-Origin Resource Sharing)) usando el parámetro expose_headers
documentado en la documentación de CORS de Starlette.
Detalles Técnicos
También podrías usar from starlette.requests import Request
.
FastAPI lo proporciona como una conveniencia para ti, el desarrollador. Pero viene directamente de Starlette.
Antes y después de la response
¶
Puedes añadir código que se ejecute con la request
, antes de que cualquier path operation la reciba.
Y también después de que se genere la response
, antes de devolverla.
Por ejemplo, podrías añadir un custom header X-Process-Time
que contenga el tiempo en segundos que tomó procesar la request y generar una response:
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
Consejo
Aquí usamos time.perf_counter()
en lugar de time.time()
porque puede ser más preciso para estos casos de uso. 🤓
Otros middlewares¶
Más adelante puedes leer sobre otros middlewares en la Guía del Usuario Avanzado: Middleware Avanzado.
Leerás sobre cómo manejar CORS con un middleware en la siguiente sección.