Ответ
Механизм lifespan в FastAPI — это современный способ управления ресурсами, которые должны быть инициализированы перед запуском приложения и очищены после его остановки. Он заменяет устаревшие обработчики событий startup и shutdown.
Основная задача — выполнение асинхронного кода для подготовки и освобождения ресурсов, таких как подключения к базам данных, кэшу или запуск фоновых задач.
Работает lifespan через асинхронный контекстный менеджер, который передается в конструктор FastAPI. Код до yield выполняется при старте, а код после yield — при остановке.
Пример реализации:
from contextlib import asynccontextmanager
from fastapi import FastAPI
# Условная функция для подключения к БД
async def connect_to_db():
print("Подключение к базе данных...")
# Здесь логика подключения
return {"connection": "active"}
# Условная функция для закрытия соединения
async def close_db_connection():
print("Соединение с базой данных закрыто.")
@asynccontextmanager
async def lifespan(app: FastAPI):
# --- Код, выполняемый при старте приложения ---
db_connection = await connect_to_db()
app.state.db = db_connection # Сохраняем состояние для доступа в эндпоинтах
print("Приложение запущено.")
yield # В этот момент приложение начинает принимать запросы
# --- Код, выполняемый при остановке приложения ---
await close_db_connection()
print("Приложение остановлено.")
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
# Доступ к состоянию, созданному в lifespan
return {"db_status": app.state.db}
Ключевые преимущества:
- Современный подход: Является рекомендуемой заменой для
@app.on_event("startup")и@app.on_event("shutdown"). - Асинхронность: Полностью поддерживает
async/await. - Управление состоянием: Позволяет безопасно передавать инициализированные ресурсы (например, пул соединений) в приложение через
app.stateилиyield.