Pythoner
Фотография
✈️В FastAPI есть мощный инструмент для управления ресурсами приложения – @ asynccontextmanager в связке с lifespan. Это позволяет выполнить код инициализации при запуске и очистки при завершении приложения.
➡️Зачем это нужно?
- Подготовка базы данных: Создание таблиц, миграции.
- Инициализация соединений: Подключение к Redis, Kafka.
- Очистка ресурсов: Закрытие соединений, удаление временных файлов.
➡️Как это работает?
Декоратор @ asynccontextmanager создает асинхронный контекстный менеджер. Функция lifespan определяет, какой код выполняется до и после запуска приложения.
➡️Пример:
from contextlib import asynccontextmanager
from fastapi import FastAPI
# (Предположим, у вас есть функции create_db и close_db)
async def create_db():
print("Подключаемся к базе данных...")
# Здесь будет код подключения к БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("База данных подключена!")
async def close_db():
print("Закрываем соединение с базой данных...")
# Здесь будет код закрытия соединения с БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("Соединение с базой данных закрыто!")
@asynccontextmanager
async def lifespan(app: FastAPI):
print("Запуск приложения...")
await create_db()
yield
print("Завершение приложения...")
await close_db()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
return {"message": "Hello World"}
# Запуск: uvicorn main:app --reload
- При запуске FastAPI (uvicorn main:app --reload) выполнится код до yield (создание таблиц).
- При остановке FastAPI выполнится код после yield (удаление таблиц).
lifespan + @ asynccontextmanager - это чистый и эффективный способ управлять ресурсами вашего FastAPI приложения!
🐍 Pythoner
15 · 1.7K ·