Исправьте декоратор, 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 обычно удобнее отдельные маршруты списка и конкретного пользователя.