Для чего используется механизм lifespan в FastAPI и как он работает

Ответ

Механизм 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.