Задать вопрос
@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-проектов и почему? Есть ли ситуации, когда один вариант однозначно предпочтительнее другого?
  • Вопрос задан
  • 7 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

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