Índice de contenido
El lifespan es un mecanismo basado en un ContextManager que nos permite ejecutar código justo antes de que la aplicación inicie o después de que termine.
Anteriormente vimos como declarar datos de ejemplo del Request en FastAPI, veamos un aspecto más avanzado.
Implementación del Context Manager
Su uso es sencillo y emplea el decorador @asynccontextmanager. Al igual que hicimos con la base de datos, utilizaremos la palabra clave yield.
Todo lo que esté antes del yield se ejecutará al arrancar el servidor.
Todo lo que esté después del yield se ejecutará al apagar el servidor (por ejemplo, para cerrar conexiones o limpiar archivos).
Creación Automática de Datos (Seed): Preparación de las Habitaciones (Rooms) para WebSockets
He creado una función que se encarga de "poblar" las habitaciones. El flujo es el siguiente:
- Al iniciar la app, verificamos si las habitaciones ya existen en la base de datos.
- Si no están creadas, iteramos una lista predefinida e insertamos los registros.
- Ejecutamos el commit para guardar los cambios y cerramos la sesión.
Configuración en la aplicación
Para activar este comportamiento, debemos pasar el parámetro lifespan al momento de instanciar FastAPI quedando el código como:
api_multiple.py
from contextlib import asynccontextmanager
***
def create_rooms():
db = SessionLocal()
try:
for name in ["room 1", "room 2"]:
if not db.query(models.Room).filter(models.Room.name == name).first():
db.add(models.Room(name=name))
db.commit()
finally:
db.close()
@asynccontextmanager
async def lifespan(app: FastAPI):
print('****START')
create_rooms()
yield
print('****END')
app = FastAPI(lifespan=lifespan)
router = APIRouter()Métodos del ciclo de vida obsoletos (Deprecated)
Si revisas documentación antigua, es posible que encuentres los decoradores @app.on_event("startup") y @app.on_event("shutdown"). Es importante que sepas que estos eventos están obsoletos (deprecated).
Aunque todavía funcionan, la comunidad y los desarrolladores de FastAPI recomiendan usar exclusivamente lifespan, ya que es más flexible y permite manejar el ciclo de vida de forma más integrada en un solo bloque de código.
Conclusión
Este mecanismo de inicialización de datos es ideal para proyectos reales donde ciertos valores estáticos (como roles, categorías o habitaciones) deben estar disponibles desde el primer segundo sin necesidad de crear interfaces de usuario adicionales para cargarlos.
Ya con las habitaciones generadas automáticamente, estamos listos para pasar a la siguiente fase.
El siguiente paso, es aprender a implementar los principios del Clean Code en una app en FastAPI.