Saltar a contenido

middlewares

Un "middleware" es una función/clase que trabaja con cada petición(request) antes de que sea procesada por cualquier operación de ruta específica(route). Y también con cada respuesta(response) antes de devolverla.

Normalmente, un middleware interviene en las siguientes, acciones permitiendo (si se desea) interceptar y/o modificar el flujo de datos:

  • Preprocesamiento de la solicitud (por ejemplo, validación de cabeceras, normalización de rutas, etc.)
  • Modificación del estado de la aplicación (por ejemplo, sesiones, caché, etc.)
  • Postprocesamiento de una respuesta (por ejemplo, log)

Nota

Se recomienda cargar(registrar) los middlewares, utilizando add_middleware de FastApi.

Defina estas funciones después de la instancia principal del BackEnd.

El uso de estas funciones se encuentra en el archivo app/server.py.

veamos un ejemplo de como funcionan los middlewares en FastApi y la forma en como se ejecutan:

                       Request
╭─────────────────────────┼────╮
│ LogRequestMiddleware    │    │
│ ╭───────────────────────┼───╮│
│ │ CORSMiddleware        │   ││
│ │ ╭─────────────────────┼──╮││
│ │ │ GZipMiddleware      │  │││
│ │ │ ╭───────────────────┼─╮│││
│ │ │ │ DependA           │ ││││
│ │ │ ├┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┼┈┤│││
│ │ │ │ DependB           │ ││││
│ │ │ ├┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┼┈┤│││
│ │ │ │ route             │ ││││
│ │ │ ╰───────────────────┼─╯│││
│ │ ╰─────────────────────┼──╯││
│ ╰───────────────────────┼───╯│
╰─────────────────────────┼────╯
                       Response

Importante

El orden en que se utilizan los middlewares influye directamente en el comportamiento de tu BackEnd, por lo que definir el orden correcto de ejecución, es muy importante.

En consecuencia, el primer middleware registrado en la cadena del constructor, es el primero en ejecutarse durante el procesamiento de la solicitud (LogRequestMiddleware), seguido por los demás en el orden en que los defines (CORSMiddleware y GZipMiddleware).

Si se utilizan dependencias(Depend), estas también seguirán el orden en que fueron declaradas, y finalmente, cuando la respuesta se envía de vuelta, esta recorre la misma cadena de middlewares, pero en orden inverso.

# app/server.py

from fastapi.middleware.gzip import GZipMiddleware
...

fastapp = FastAPI(
    title="Callisto",
    description="Callisto BackEnd",
)

...

# register middlewares
fastapp.add_middleware(GZipMiddleware, minimum_size=100, compresslevel=6)

Nota

Para más información consulta el módulo middlewares.

GZipMiddleware

Gestiona las respuestas GZip para cualquier solicitud que incluya "gzip" en la cabecera Accept-Encoding. El middleware gestionará tanto las respuestas estándar como las de streaming.

1
2
3
4
from fastapi.middleware.gzip import GZipMiddleware

...
fastapp.add_middleware(GZipMiddleware, minimum_size=100, compresslevel=6)

ForceGZipMiddleware

Comprueba si la cabecera Accept-Encoding: gzip, deflate viene en la petición. Si no es así, modifica la solicitud entrante para forzar al BackEnd a responder el contenido compreso con Gzip.

1
2
3
4
from .middlewares import ForceGZipMiddleware
...

fastapp.add_middleware(ForceGZipMiddleware)

CORS

CORS o "Cross-Origin Resource Sharing" se refiere a las situaciones en las que un frontend que se ejecuta en un navegador tiene código JavaScript que se comunica con un backend, y el backend se encuentra en un "origen" diferente al del frontend.

from fastapi.middleware.cors import CORSMiddleware
...

fastapp.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

LogRequestMiddleware

Una clase que actua como middleware ASGI para FastApi/Starlette, con la información para armar un log e imprimirlo.

1
2
3
4
from .middlewares import LogRequestMiddleware
...

fastapp.add_middleware(LogRequestMiddleware)

Lectura recomendada