0
рейтинг

1
0
Есть ответы

Промт для создания REST API на Python с FastAPI и документацией

REST API на FastAPI

FastAPI — удачный выбор для работы с ИИ: типы в сигнатурах и схемы Pydantic дают модели строгий каркас, в который трудно написать ерунду. Документация при этом генерируется сама, что снимает целый класс задач.

Но по умолчанию модель выдаёт учебный пример: один эндпоинт, словарь вместо базы, никакой обработки ошибок. Чтобы получить работающий код, каркас надо задать в промте.

Промт для ресурса целиком

Ты — backend-разработчик. Напиши CRUD для ресурса [название] на FastAPI.

КОНТЕКСТ:
Python [версия], FastAPI, SQLAlchemy [версия], PostgreSQL.
Аутентификация уже есть, зависимость get_current_user возвращает объект User с полями [перечислить].

МОДЕЛЬ:
[поля, типы, обязательность, ограничения]

ТРЕБОВАНИЯ:
1. Отдельные схемы Pydantic: Create, Update, Response. В Response не отдавать внутренние поля [перечислить].
2. Валидация на границе: длины строк, диапазоны чисел, форматы. Ошибка валидации — 422 с указанием поля.
3. Коды ответов явно: 201 на создание, 204 на удаление, 404 если нет, 409 на конфликт уникальности, 403 если чужой объект.
4. Список — с пагинацией через limit/offset, максимум limit = 100, и с общим количеством в ответе.
5. Частичное обновление через PATCH, не подменяя незаданные поля на None.
6. Никаких блокирующих вызовов в async-функциях. Работа с БД — через сессию, переданную зависимостью.
7. Каждый эндпоинт с описанием и примером в docstring — они попадут в OpenAPI.

ЧЕГО НЕ ДЕЛАТЬ:
- не изобретать структуру проекта, использовать: routers/, schemas/, models/, services/;
- не писать бизнес-логику в обработчике маршрута, выносить в сервис;
- не ловить голый Exception.

Пункт пятый ловит частую ошибку: наивная реализация PATCH затирает поля, которые клиент не присылал. В Pydantic это решается через exclude_unset, и об этом надо попросить прямо.

Что попросить следом

ЗапросЧто получаете
«Опиши ошибки единым форматом»Общий обработчик исключений и предсказуемое тело ошибки
«Добавь фильтры и сортировку в список»Параметры запроса с валидацией допустимых полей сортировки
«Напиши тесты через TestClient»Проверка кодов, валидации и прав доступа
«Что сломается при 100 запросах в секунду»Список узких мест: N+1, отсутствие индексов, синхронные вызовы

Документация

OpenAPI FastAPI собирает сам, но по умолчанию она бедная. Отдельный промт:

Дополни эндпоинты метаданными для OpenAPI:
summary и description для каждого маршрута, description для каждого поля схем,
примеры запроса и ответа через Field(examples=...),
описание всех возможных кодов ответа через responses=,
теги для группировки маршрутов.
Тексты пиши так, чтобы их читал сторонний разработчик, не знакомый с нашей предметной областью.

Последняя фраза важна. Без неё описания получаются в стиле «Создаёт объект» — то есть повторяют название метода и не добавляют ничего.

Что проверять руками

  • N+1 в списке. Модель почти всегда забывает про selectinload для связанных объектов.
  • Права на чужой объект. Проверка владельца часто оказывается только в GET и отсутствует в PATCH и DELETE.
  • Транзакции. Где начинается и заканчивается — модель об этом обычно не думает.
  • Версии библиотек. Синтаксис Pydantic и SQLAlchemy заметно менялся между мажорными версиями; несоответствие даёт код, который не запустится.

И общее правило: сгенерированный эндпоинт — это черновик, который надо прочитать целиком. Он выглядит законченным гораздо раньше, чем становится таковым, и в этом основная ловушка.

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

1 ответ

обсуждение открыто
0
25 августа 2026 23:02
Это отличный шаблон промта — он закрывает 90% типичных проблем «учебных» примеров. Чтобы я сгенерировал готовый код по нему, мне не хватает контекста вашего ресурса.

Уточните, пожалуйста:

1. Название ресурса (например: Task, Product, Article)
2. Версии: Python (3.11/3.12?), SQLAlchemy (1.4/2.0?), Pydantic (v1/v2?)
3. Поля модели с типами, обязательностью, ограничениями (max_length, gt/lt, regex, unique и т.д.)
4. Какие поля скрыть в Response (обычно hashed_password, id внутренних сущностей, created_at/updated_at если не нужны клиенту)
5. Поля User, которые возвращает get_current_user (минимум id, role/is_superuser для проверки прав)
6. Есть ли связи (foreign keys) — нужны ли selectinload в списке/деталях?
7. Нужны ли фильтры/сортировка сразу или базовый CRUD достаточно?

---

### Пример заполнения (для ориентации)


РЕСУРС: Task
Python 3.12, SQLAlchemy 2.0, Pydantic v2
User: id (int), is_superuser (bool)

МОДЕЛЬ Task:
- id: int, PK, автоинкремент
- title: str, обязательное, max_length=200
- description: str, опционально, max_length=5000
- status: Enum("new", "in_progress", "done"), default="new"
- priority: int, 1..3, default=1
- owner_id: int, FK -> User.id, не nullable
- created_at: datetime, server_default=now()
- updated_at: datetime, onupdate=now()

СКРЫТЬ В RESPONSE: owner_id (отдавать вложенный User или только id — уточните)
СВЯЗИ: owner (User) — нужен selectinload в GET /tasks и GET /tasks/{id}


---

Что я выдам по готовому контексту:
- models/task.py — SQLAlchemy модель
- schemas/task.py — Create/Update/Response схемы с Field(examples=...)
- services/task.py — бизнес-логика (CRUD + проверка прав)
- routers/task.py — эндпоинты с responses=, summary, description, пагинацией
- exceptions.py — единый формат ошибок + хендлеры
- (опционально) tests/test_tasks.py — базовые проверки кодов/валидации/прав

Пришлите заполненный контекст — соберу готовый модуль.

Ответ сгенерирован ИИ автоматически, потому что вопрос какое-то время оставался без ответа. Проверьте важные детали и поправьте, если что-то не так — живой ответ всегда ценнее.

Добавление комментария

Не публикуется. Нужен для уведомлений об ответах.
Отвечайте по существу: решение, а не «у меня то же самое».
Кликните на изображение чтобы обновить код, если он неразборчив