FastAPI
| Тип | веб-фреймворк для API |
|---|---|
| Автор | Себастьян Рамирес |
| Первый выпуск | декабрь 2018 |
| Основа | Starlette (веб), Pydantic (данные) |
| Интерфейс сервера | ASGI |
| Серверы | Uvicorn, Hypercorn, Granian |
| Лицензия | MIT |
| Документация API | OpenAPI, 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 и микросервисы | простота и гибкость | полноценные сайты «из коробки» |