10 промтов для FastAPI: эндпоинты, Pydantic и фоновая обработка

Введение

FastAPI — один из самых быстрорастущих веб-фреймворков для Python. Его популярность объясняется скоростью работы, автоматической генерацией документации (OpenAPI/Swagger) и строгой типизацией через Pydantic. К середине 2026 года FastAPI используется в стартапах, крупных корпорациях и open-source проектах — от микросервисов до AI-платформ. Однако даже опытные разработчики часто упускают возможности фреймворка: не используют фоновые задачи, забывают про кастомные валидаторы или пишут неэффективные эндпоинты. В этой статье я собрал 10 промтов для FastAPI — от базовых до экспертных — с примерами кода и пояснениями. Каждый промт решает конкретную задачу, с которой я сталкивался в реальных проектах.

1. Базовый эндпоинт с GET-запросом

Задача: Создать простой эндпоинт, который принимает параметры пути и query-параметры, возвращает JSON.

Промт: «Напиши FastAPI эндпоинт GET /items/{item_id}, который принимает item_id (int) и необязательный query-параметр q (str). Возвращай словарь с item_id и q.»

Пример результата:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

Комментарий: FastAPI автоматически валидирует тип item_id — если передать строку, вернёт 422 ошибку. Query-параметр q опционален.

2. POST-эндпоинт с Pydantic моделью

Задача: Создать POST-эндпоинт, который принимает JSON-тело, валидированное через Pydantic.

Промт: «Создай Pydantic модель Item с полями name (str), price (float), is_offer (bool, по умолчанию False). Напиши POST /items, который принимает Item и возвращает его с id.»

Пример результата:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = False

@app.post("/items")
async def create_item(item: Item):
    return {"id": 1, **item.model_dump()}

Комментарий: Pydantic v2 использует model_dump() вместо dict(). Встроенная валидация проверяет типы и обязательность полей.

3. Кастомная валидация Pydantic

Задача: Добавить кастомный валидатор для поля email в Pydantic модели.

Промт: «Создай Pydantic модель User с полями username (str) и email (str). Добавь валидатор, который проверяет, что email содержит '@' и '.' после '@'. Если нет — вызывай ValueError.»

Пример результата:

from pydantic import BaseModel, field_validator

class User(BaseModel):
    username: str
    email: str

    @field_validator("email")
    @classmethod
    def validate_email(cls, v):
        if "@" not in v or "." not in v.split("@")[1]:
            raise ValueError("Invalid email format")
        return v

Комментарий: field_validator — мощный инструмент. Можно проверять базы данных, форматы или бизнес-логику. Pydantic v2 рекомендует использовать @classmethod.

4. Фоновая задача (BackgroundTasks)

Задача: Выполнить длительную операцию (например, отправку email) после ответа клиенту.

Промт: «Используй BackgroundTasks из FastAPI. Создай эндпоинт POST /send-email, который принимает email и тему, а затем асинхронно вызывает функцию send_email (которая просто печатает в консоль). Верни ответ сразу.»

Пример результата:

from fastapi import FastAPI, BackgroundTasks

app = FastAPI()

def send_email(email: str, subject: str):
    # Имитация отправки
    print(f"Sending email to {email}: {subject}")

@app.post("/send-email")
async def send_email_endpoint(email: str, subject: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(send_email, email, subject)
    return {"message": "Email will be sent"}

Комментарий: BackgroundTasks выполняются в том же процессе, но после ответа. Для тяжёлых задач используйте Celery или Redis Queue. ASI Biont поддерживает подключение к очередям через API — подробнее на asibiont.com/courses.

5. Асинхронные эндпоинты с httpx

Задача: Сделать асинхронный HTTP-запрос к внешнему API внутри эндпоинта.

Промт: «Напиши GET /fetch-data, который делает асинхронный GET-запрос к https://jsonplaceholder.typicode.com/posts/1 через httpx и возвращает полученные данные.»

Пример результата:

import httpx
from fastapi import FastAPI

app = FastAPI()

@app.get("/fetch-data")
async def fetch_data():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://jsonplaceholder.typicode.com/posts/1")
        return response.json()

Комментарий: Использование async/await не блокирует event loop. httpx поддерживает HTTP/2 и таймауты.

6. Dependency Injection для авторизации

Задача: Создать зависимость для проверки API-ключа.

Промт: «Напиши зависимость verify_token, которая получает заголовок Authorization из запроса. Если токен равен 'secret123' — пропускает, иначе вызывает HTTPException с 401.»

Пример результата:

from fastapi import FastAPI, Header, HTTPException, Depends

app = FastAPI()

def verify_token(authorization: str = Header(...)):
    if authorization != "Bearer secret123":
        raise HTTPException(status_code=401, detail="Invalid token")
    return authorization

@app.get("/protected")
async def protected_route(token: str = Depends(verify_token)):
    return {"message": "Access granted"}

Комментарий: Depends делает код модульным. Можно создавать цепочки зависимостей.

7. Pydantic с вложенными моделями

Задача: Создать модель с вложенными объектами и списками.

Промт: «Создай Pydantic модели: Address (city, street), User (name, address: Address, tags: list[str]). Напиши POST /users, который принимает User и возвращает его.»

Пример результата:

from pydantic import BaseModel
from typing import List

class Address(BaseModel):
    city: str
    street: str

class User(BaseModel):
    name: str
    address: Address
    tags: List[str]

@app.post("/users")
async def create_user(user: User):
    return user.model_dump()

Комментарий: Вложенные модели автоматически валидируются. Можно задавать глубокую вложенность.

8. Обработка ошибок с кастомными исключениями

Задача: Создать кастомное исключение и глобальный обработчик.

Промт: «Определи класс CustomException с полями message (str) и status_code (int). Добавь обработчик исключений, который возвращает JSON с message и кодом.»

Пример результата:

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

app = FastAPI()

class CustomException(Exception):
    def __init__(self, message: str, status_code: int):
        self.message = message
        self.status_code = status_code

@app.exception_handler(CustomException)
async def custom_handler(request: Request, exc: CustomException):
    return JSONResponse(status_code=exc.status_code, content={"error": exc.message})

@app.get("/custom-error")
async def trigger_error():
    raise CustomException(message="Something went wrong", status_code=418)

Комментарий: Глобальные обработчики улучшают читаемость кода и клиентский опыт.

9. Фоновая обработка с Celery

Задача: Интегрировать Celery для выполнения тяжёлых задач.

Промт: «Настрой Celery с Redis как брокером. Создай задачу process_data, которая принимает int и возвращает квадрат. Эндпоинт POST /process запускает задачу и возвращает task_id.»

Пример результата:

# tasks.py
from celery import Celery

celery_app = Celery("tasks", broker="redis://localhost:6379/0")

@celery_app.task
def process_data(x: int):
    return x ** 2
# main.py
from fastapi import FastAPI
from tasks import process_data

app = FastAPI()

@app.post("/process")
async def process(x: int):
    task = process_data.delay(x)
    return {"task_id": task.id}

Комментарий: Celery запускается отдельно. Для продакшена используйте Flower для мониторинга.

10. WebSocket эндпоинт

Задача: Создать WebSocket для реального времени.

Промт: «Напиши WebSocket эндпоинт /ws, который принимает сообщение и отправляет его обратно в верхнем регистре.»

Пример результата:

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(data.upper())

Комментарий: WebSocket полезен для чатов, уведомлений и стриминга данных.

Заключение

FastAPI — это не просто быстрый фреймворк, а экосистема с мощными инструментами для валидации, асинхронности и фоновой обработки. Представленные 10 промтов покрывают 80% типовых задач: от простых REST API до сложных систем с очередями и WebSocket. Главное — не бояться экспериментировать с Pydantic и async/await. Документация FastAPI на июль 2026 года остаётся одной из лучших в мире Python — рекомендую держать её под рукой. А если хотите углубиться в практику, взгляните на курсы ASI Biont, где разбираются реальные кейсы с FastAPI и интеграциями.

← Все статьи

Комментарии

Читайте также

Ethernet (W5500, ENC28J60) + ASI Biont: проводной IoT без программирования — будущее автоматизации

14 июля 2026

Лейтнер, Elo и поправка на угадывание: как работает движок тренажёра собеседований без единого вызова LLM

14 июля 2026

Интеграция RC522 (RFID) с AI-агентом ASI Biont: пошаговое руководство по подключению и автоматизации

14 июля 2026

Промышленная безопасность: как избежать штрафов и аварий на ОПО в 2026 году — курс от экспертов Ростехнадзора

14 июля 2026

Почему курс по системам реального времени — ваш следующий шаг в карьере: WebSockets, WebRTC и голосовые ассистенты

14 июля 2026

Как я собирал AI-агентную команду для реального бизнеса, а не ассистента в чате

14 июля 2026

Как ИИ-агент ASI Biont интегрируется с умным домом (Zigbee, Z-Wave) для автоматизации без кода

14 июля 2026

SEC и инсайдерская торговля: регулирование и комплаенс — курс для юристов и комплаенс-специалистов, который объясняет Rule 10b-5, 10b5-1 планы и кейсы на реальных прецедентах

14 июля 2026

10 промтов для CI/CD: GitHub Actions, GitLab CI и ArgoCD для профессионалов

14 июля 2026