FastAPI: Создаём рабочий API за 5 минут без магии

FastAPI: Создаём рабочий API за 5 минут без магии

Представьте, что вам нужно создать веб-интерфейс для вашего приложения, который будет быстро работать, автоматически генерировать документацию и при этом писать его будет в удовольствие. Это не фантастика — это FastAPI, современный фреймворк на Python, который действительно позволяет развернуть рабочий API быстрее, чем вы успеете заварить чай. Давайте сделаем это вместе.

Почему именно FastAPI?

FastAPI построен на стандартах OpenAPI и JSON Schema, что даёт ему феноменальные преимущества: автоматическая интерактивная документация (Swagger UI и ReDoc), валидация данных на уровне типов, асинхронная поддержка из коробки и высокая производительность, сравнимая с Node.js и Go. Он идеален для микросервисов, бэкендов для SPA и быстрых прототипов.

FastAPI использует аннотации типов Python (type hints) не только для подсказок в IDE, но и для реальной валидации запросов и генерации схемы API. Это меняет правила игры.

Шаг 1: Установка и базовый скелет

Откройте терминал. Создайте виртуальное окружение и установите FastAPI и Uvicorn (ASGI-сервер для запуска).

pip install fastapi uvicorn

Создайте файл main.py и добавьте минимальный код:

from fastapi import FastAPI

app = FastAPI(title=\"Мой Супер-API\")

@app.get(\"/\")
async def root():
    return {\"message\": \"Hello, API!\"}

Что здесь происходит?

  • Импортируем класс FastAPI и создаём экземпляр приложения.
  • Декоратор @app.get(\"/\") указывает, что функция root будет обрабатывать GET-запросы к корневому пути.
  • Функция возвращает словарь, который автоматически конвертируется в JSON.

Шаг 2: Запуск и первая проверка

Запустите сервер командой:

uvicorn main:app --reload

Откройте браузер и перейдите по адресу http://127.0.0.1:8000. Вы увидите ваше сообщение {\"message\": \"Hello, API!\"}. А теперь самое интересное — откройте /docs. Перед вами автоматически сгенерированная интерактивная документация Swagger UI, где можно тестировать ваш API прямо из браузера!

Параметр --reload автоматически перезагружает сервер при изменении кода. Незаменим для разработки.

Шаг 3: Добавляем реальные эндпоинты с параметрами

Давайте создадим что-то полезное. Например, API для управления списком задач (To-Do). Добавим в main.py:

from typing import Optional
from pydantic import BaseModel

class Task(BaseModel):
    id: int
    title: str
    description: Optional[str] = None
    completed: bool = False

tasks_db = []

@app.post(\"/tasks/\", response_model=Task)
async def create_task(task: Task):
    tasks_db.append(task)
    return task

@app.get(\"/tasks/{task_id}\", response_model=Task)
async def read_task(task_id: int):
    # Здесь должна быть логика поиска по ID
    return Task(id=task_id, title=\"Пример задачи\", completed=False)

Разбираем новые элементы

  1. Pydantic модель Task: Определяет структуру данных. FastAPI использует её для валидации тела запроса (в create_task) и для генерации JSON-схемы.
  2. Эндпоинт POST /tasks/: Принимает JSON с задачей, валидирует его по модели и добавляет в «базу» (пока это список).
  3. Эндпоинт GET с параметром пути /tasks/{task_id}: Извлекает task_id из URL и использует его. Попробуйте в Swagger UI!

Шаг 4: Запросы с query-параметрами и валидация

Добавим поиск задач с фильтрацией по статусу завершения:

from fastapi import Query

@app.get(\"/tasks/\")
async def list_tasks(completed: Optional[bool] = None, limit: int = Query(10, ge=1, le=100)):
    filtered_tasks = tasks_db
    if completed is not None:
        filtered_tasks = [t for t in tasks_db if t.completed == completed]
    return filtered_tasks[:limit]

Параметр completed — необязательный query-параметр. limit использует Query для дополнительной валидации: значение должно быть от 1 до 100 (ge — greater or equal, le — less or equal).

Шаг 5: Итог и куда двигаться дальше

За 5 минут мы создали API с несколькими типами эндпоинтов (GET, POST), валидацией данных, параметрами пути и запроса, а также получили готовую документацию. Это основа, на которую можно наращивать функционал: подключить реальную базу данных (например, SQLAlchemy + PostgreSQL), добавить аутентификацию (OAuth2 с JWT), CORS, фоновые задачи и развернуть на сервере (например, с помощью Docker).

Официальная документация FastAPI — одна из лучших в мире open source. Там вы найдёте исчерпывающие руководства по всем возможным сценариям.

FAQ: Часто задаваемые вопросы

FastAPI медленный?

Нет, он один из самых быстрых фреймворков на Python благодаря использованию Starlette (для веб-части) и Pydantic (для валидации).

Нужно ли знать асинхронное программирование?

Не обязательно. Вы можете писать синхронные функции, но для максимальной производительности в IO-операциях (запросы к БД, внешние API) рекомендуется использовать async/await.

Подходит ли FastAPI для больших проектов?

Абсолютно. Его модульность, поддержка зависимостей (Dependency Injection) и чёткая структура позволяют строить сложные приложения.

Есть ли поддержка WebSockets?

Да, FastAPI имеет встроенную поддержку WebSockets, что делает его отличным выбором для реального времени.