Use lifespan context manager for async startup (connect DB, load model) and shutdown cleanup.
Startup and Shutdown Events
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
# STARTUP
print("Starting up...")
await database.connect()
await redis_client.ping()
# Load ML models
app.state.model = load_model("model.pkl")
yield # App runs here
# SHUTDOWN
print("Shutting down...")
await database.disconnect()
await redis_client.close()
app = FastAPI(lifespan=lifespan)
@app.get("/predict")
async def predict(data: InputData, request: Request):
model = request.app.state.model
result = model.predict([data.features])
return {"prediction": result[0]}