Задать вопрос
@Nick331045

Где хранить сессию SQLAlchemy в FastAPI: в конструкторе сервиса или передавать в каждый метод?

Проектирую FastAPI-приложение с SQLAlchemy (async). Столкнулся с двумя связанными вопросами по архитектуре сервисного слоя.
Вопрос 1: где хранить сессию?
Вариант А - сессия в конструкторе:
class MealService:
    def __init__(self, session: AsyncSession) -> None:
        self.session = session
    async def get(self, id: int) -> Meal: ...

Вариант Б - сессия как аргумент каждого метода:
class MealService:
    async def get(self, session: AsyncSession, id: int) -> Meal: ...

Вопрос 2: синглтон или per-request?
Вариант А - per-request через Depends:
def get_meal_service(session: AsyncSession = Depends(get_session)) -> MealService:
    return MealService(session)

Вариант Б - синглтон:
meal_service = MealService()
# в роутере
async def get_meal(id: int, session: AsyncSession = Depends(get_session)):
    return await meal_service.get(session, id)

Какой подход считается более правильным для FastAPI-проектов и почему? Есть ли ситуации, когда один вариант однозначно предпочтительнее другого?
  • Вопрос задан
  • 355 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Вариант А + per-request через Depends — это стандарт, так в официальной доке FastAPI. Синглтон с сессией в конструкторе — знакомая засада: один объект на все запросы одновременно, async-сессия для этого не рассчитана. Синглтон с сессией-в-методах технически не сломает, но тогда ты теряешь всё удобство Depends и таскаешь session руками.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы