# FastAPI

> Современный асинхронный веб-фреймворк для создания API на Python; использует аннотации типов для валидации данных через Pydantic и автоматически генерирует документацию OpenAPI.

Источник: https://llmdocs.ru/wiki/fastapi/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: веб-фреймворк для API
- **Автор**: Себастьян Рамирес
- **Первый выпуск**: декабрь 2018
- **Основа**: Starlette (веб), Pydantic (данные)
- **Интерфейс сервера**: ASGI
- **Серверы**: Uvicorn, Hypercorn, Granian
- **Лицензия**: MIT
- **Документация API**: OpenAPI, Swagger UI, ReDoc — автоматически
**FastAPI** — веб-фреймворк для создания API на [Python](https://llmdocs.ru/wiki/python.md). Параметры обработчиков описываются обычными [аннотациями типов](https://llmdocs.ru/wiki/type-hints.md), и по ним FastAPI сам проверяет входящие данные, преобразует их, сериализует ответы и строит интерактивную документацию [API](https://llmdocs.ru/wiki/rest.md) в формате OpenAPI. Фреймворк асинхронный, работает поверх интерфейса ASGI и по скорости близок к серверам на Node.js и Go.[1]

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

## История

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

## Пример

```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]
```

```bash
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](https://llmdocs.ru/wiki/json.md). Запрос `GET /items/abc` получит ответ `422` с описанием ошибки, а не исключение в коде (см. [Коды состояния HTTP](https://llmdocs.ru/wiki/http-status-codes.md)).[2]

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

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

```python
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
```

Зависимости кэшируются в рамках запроса, могут зависеть друг от друга и легко подменяются в тестах. На них же строятся проверки [аутентификации и прав](https://llmdocs.ru/wiki/authn-authz.md).

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

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

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

## Возможности

- Автоматическая документация OpenAPI — её используют фронтенд-разработчики, генераторы клиентов и [агенты](https://llmdocs.ru/wiki/ai-agent.md) при вызове API.
- Фоновые задачи, WebSocket, потоковые ответы (в том числе для генерации текста LLM по токенам).
- Безопасность: схемы OAuth2, ключи API, интеграция с JWT ([OAuth 2.0 и OpenID Connect](https://llmdocs.ru/wiki/oauth-oidc.md)).
- `TestClient` для тестов с [pytest](https://llmdocs.ru/wiki/pytest.md) без запуска сервера.
- Middleware, [CORS](https://llmdocs.ru/wiki/cors.md), обработчики исключений, подключение подприложений.

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

В продакшене приложение запускают в [Docker](https://llmdocs.ru/wiki/docker.md)-контейнере командой `fastapi run` или через Uvicorn с несколькими рабочими процессами, за [обратным прокси](https://llmdocs.ru/wiki/reverse-proxy.md) вроде [nginx](https://llmdocs.ru/wiki/nginx.md) или [Caddy](https://llmdocs.ru/wiki/caddy.md), либо в [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md).

## Сравнение

| | FastAPI | [Flask](https://llmdocs.ru/wiki/flask.md) | [Django](https://llmdocs.ru/wiki/django.md) |
|---|---|---|---|
| Модель | асинхронный (ASGI) | синхронный (WSGI) | синхронный, частично асинхронный |
| Валидация данных | встроена (Pydantic) | расширения | формы, DRF |
| Документация API | автоматически | расширения | через DRF и пакеты |
| ORM и админка | нет, выбор свой | нет | встроены |
| Сильная сторона | API и микросервисы | простота и гибкость | полноценные сайты «из коробки» |

## См. также

- [Dataclasses и Pydantic](https://llmdocs.ru/wiki/dataclasses-pydantic.md)
- [REST](https://llmdocs.ru/wiki/rest.md)
- [asyncio](https://llmdocs.ru/wiki/asyncio.md)
- [Flask](https://llmdocs.ru/wiki/flask.md)
- [Django](https://llmdocs.ru/wiki/django.md)

## Источники

1. [FastAPI — документация](https://fastapi.tiangolo.com/)
2. [FastAPI — Tutorial: User Guide](https://fastapi.tiangolo.com/tutorial/)
3. [FastAPI — Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/)
4. [Starlette](https://www.starlette.io/)
5. [ASGI Documentation](https://asgi.readthedocs.io/)
6. [Uvicorn](https://www.uvicorn.org/)
