FastAPI

Материал из llmdocs — справочник разработчика
Портал: Python
FastAPI
Типвеб-фреймворк для API
АвторСебастьян Рамирес
Первый выпускдекабрь 2018
ОсноваStarlette (веб), Pydantic (данные)
Интерфейс сервераASGI
СерверыUvicorn, Hypercorn, Granian
ЛицензияMIT
Документация APIOpenAPI, Swagger UI, ReDoc — автоматически

FastAPI — веб-фреймворк для создания API на Python. Параметры обработчиков описываются обычными аннотациями типов, и по ним FastAPI сам проверяет входящие данные, преобразует их, сериализует ответы и строит интерактивную документацию API в формате OpenAPI. Фреймворк асинхронный, работает поверх интерфейса ASGI и по скорости близок к серверам на Node.js и Go.[1]

FastAPI стал одним из самых популярных Python-фреймворков для бэкендов, микросервисов, сервинга моделей машинного обучения и инструментов для языковых моделей.

История

Себастьян Рамирес, известный в сети как tiangolo, выпустил FastAPI в декабре 2018 года, объединив лучшие идеи существующих инструментов: лёгкость Flask, сериализаторы Django REST Framework, автодокументацию из мира API. Фреймворк собран из двух библиотек: Starlette отвечает за веб-часть (маршрутизация, запросы, WebSocket),[4] Pydantic — за данные (см. Dataclasses и Pydantic). Ключевой идеей стало использование стандартных аннотаций Python, которые уже понимают редакторы и анализаторы типов.

Пример

# main.py
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel, Field

app = FastAPI(title="Каталог")

class ItemIn(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    price: float = Field(gt=0)
    tags: list[str] = []

class Item(ItemIn):
    id: int

DB: dict[int, Item] = {}

@app.post("/items", response_model=Item, status_code=201)
async def create_item(data: ItemIn) -> Item:
    item = Item(id=len(DB) + 1, **data.model_dump())
    DB[item.id] = item
    return item

@app.get("/items/{item_id}")
async def get_item(item_id: int) -> Item:
    if item_id not in DB:
        raise HTTPException(status_code=404, detail="Не найдено")
    return DB[item_id]

@app.get("/items")
async def list_items(limit: int = Query(20, le=100), tag: str | None = None) -> list[Item]:
    items = [i for i in DB.values() if tag is None or tag in i.tags]
    return items[:limit]
uv add "fastapi[standard]"
uv run fastapi dev main.py        # сервер разработки с автоперезагрузкой
# документация: http://127.0.0.1:8000/docs (Swagger UI) и /redoc

Из аннотаций FastAPI понимает, что item_id берётся из пути и должен быть целым числом, limit и tag — из строки запроса, а data — из тела запроса в JSON. Запрос GET /items/abc получит ответ 422 с описанием ошибки, а не исключение в коде (см. Коды состояния HTTP).[2]

Внедрение зависимостей

Механизм Depends позволяет объявлять общие ресурсы — сессию базы данных, текущего пользователя, настройки — и получать их в обработчиках:[3]

from typing import Annotated
from fastapi import Depends, Header

async def get_db():
    async with SessionLocal() as session:
        yield session                         # закрывается после ответа

async def current_user(authorization: Annotated[str, Header()], db=Depends(get_db)):
    user = await db.get_user_by_token(authorization.removeprefix("Bearer "))
    if not user:
        raise HTTPException(status_code=401)
    return user

@app.get("/me")
async def me(user=Depends(current_user)):
    return user

Зависимости кэшируются в рамках запроса, могут зависеть друг от друга и легко подменяются в тестах. На них же строятся проверки аутентификации и прав.

ASGI и асинхронность

FastAPI — ASGI-приложение: асинхронный аналог старого стандарта WSGI, поддерживающий WebSocket, потоковые ответы и долгие соединения.[5] Запускается сервером Uvicorn или аналогами.[6]

  • Обработчики async def выполняются в цикле событий asyncio — их стоит использовать с асинхронными библиотеками (httpx, asyncpg, SQLAlchemy async).
  • Обычные def-обработчики FastAPI запускает в пуле потоков, поэтому блокирующий код в них не останавливает сервер.
  • Главная ошибка — блокирующий вызов (requests.get, time.sleep, синхронный драйвер БД) внутри async def: он замораживает все запросы.

Возможности

  • Автоматическая документация OpenAPI — её используют фронтенд-разработчики, генераторы клиентов и агенты при вызове API.
  • Фоновые задачи, WebSocket, потоковые ответы (в том числе для генерации текста LLM по токенам).
  • Безопасность: схемы OAuth2, ключи API, интеграция с JWT (OAuth 2.0 и OpenID Connect).
  • TestClient для тестов с pytest без запуска сервера.
  • Middleware, CORS, обработчики исключений, подключение подприложений.

Развёртывание

В продакшене приложение запускают в Docker-контейнере командой fastapi run или через Uvicorn с несколькими рабочими процессами, за обратным прокси вроде nginx или Caddy, либо в Kubernetes.

Сравнение

FastAPI Flask Django
Модель асинхронный (ASGI) синхронный (WSGI) синхронный, частично асинхронный
Валидация данных встроена (Pydantic) расширения формы, DRF
Документация API автоматически расширения через DRF и пакеты
ORM и админка нет, выбор свой нет встроены
Сильная сторона API и микросервисы простота и гибкость полноценные сайты «из коробки»

См. также

Источники

  1. FastAPI — документация
  2. FastAPI — Tutorial: User Guide
  3. FastAPI — Dependencies
  4. Starlette
  5. ASGI Documentation
  6. Uvicorn