4.3 KiB
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.
/// note | Detalles Técnicos
Si tienes dependencias con yield, el código de salida se ejecutará después del middleware.
Si hubiera tareas en segundo plano (cubiertas en la sección Tareas en segundo plano{.internal-link target=_blank}, lo verás más adelante), se ejecutarán 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_nextque recibirá larequestcomo parámetro.- Esta función pasará la
requesta la correspondiente path operation. - Luego devuelve la
responsegenerada por la correspondiente path operation.
- Esta función pasará la
- Puedes entonces modificar aún más la
responseantes de devolverla.
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
/// tip | 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){.internal-link target=_blank}) usando el parámetro expose_headers documentado en la documentación de CORS de Starlette.
///
/// note | 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:
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
/// tip | Consejo
Aquí usamos time.perf_counter() en lugar de time.time() porque puede ser más preciso para estos casos de uso. 🤓
///
Orden de ejecución con múltiples middlewares
Cuando añades múltiples middlewares usando ya sea el decorador @app.middleware() o el método app.add_middleware(), cada nuevo middleware envuelve la aplicación, formando un stack. El último middleware añadido es el más externo, y el primero es el más interno.
En el camino de la request, el middleware más externo se ejecuta primero.
En el camino de la response, se ejecuta al final.
Por ejemplo:
app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)
Esto da como resultado el siguiente orden de ejecución:
-
Request: MiddlewareB → MiddlewareA → ruta
-
Response: ruta → MiddlewareA → MiddlewareB
Este comportamiento de apilamiento asegura que los middlewares se ejecuten en un orden predecible y controlable.
Otros middlewares
Más adelante puedes leer sobre otros middlewares en la Guía del Usuario Avanzado: Middleware Avanzado{.internal-link target=_blank}.
Leerás sobre cómo manejar CORS con un middleware en la siguiente sección.