Обзор кода асинхронного эндпоинта

Исправьте декоратор, async def, Annotated, отступы и условие is_(True). Разведите возврат одного пользователя и списка, предусмотрев 404.

Короткий ответ

Что ответить на собеседовании

Исправьте декоратор, async def, Annotated, отступы и условие is_(True). Разведите возврат одного пользователя и списка, предусмотрев 404.

Подробный разбор

Ответ с пояснениями

Условие

Выполни ревью представленного фрагмента кода, указав на стилистические и синтаксические проблемы.

base.get("/users")
async handler = get_users(
    user_id: annotated[int | None, Query()] = None,
-> list[User] | User:
    async with async_session_maker.begin() as session:
    start = select(User).where(User.is_active.is_IT->e))
    if user_id is not None:
    start = start.where(user.id == user_id)
    return await session.scalar(start)
    return (await session.scalars(start)).all()

Ответ

Исправьте декоратор, async def, Annotated, отступы и условие is_(True). Разведите возврат одного пользователя и списка, предусмотрев 404.

Пример с ORM-моделью User и отдельно определённой Pydantic-схемой UserOut, поддерживающей чтение атрибутов ORM:

from typing import Annotated
from fastapi import Query, HTTPException
from sqlalchemy import select

@base.get('/users', response_model=list[UserOut] | UserOut)
async def get_users(user_id: Annotated[int | None, Query()] = None):
    async with async_session_maker() as session:
        stmt = select(User).where(User.is_active.is_(True))
        if user_id is not None:
            user = await session.scalar(stmt.where(User.id == user_id))
            if user is None:
                raise HTTPException(404, 'Пользователь не найден')
            return user
        return (await session.scalars(stmt)).all()

В исходнике несколько синтаксических ошибок и затенение имени модели. Схема ответа должна исключать секретные поля; для большого списка требуется пагинация. В production обычно удобнее отдельные маршруты списка и конкретного пользователя.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее