FastAPI
Фреймворк FastAPI: высокая производительность, простота изучения, быстрая разработка, готовность к использованию в промышленной среде
Документация: https://fastapi.tiangolo.com
Исходный код: https://github.com/fastapi/fastapi
FastAPI — это современный высокопроизводительный веб-фреймворк для создания API на Python, основанный на стандартных подсказках типов Python.
Ключевые особенности:
- Быстрый: очень высокая производительность, на уровне NodeJS и Go (благодаря Starlette и Pydantic). Один из самых быстрых доступных фреймворков Python.
- Быстрая разработка: скорость разработки функций увеличивается примерно на 200–300%. *
- Меньше ошибок: количество ошибок, вызванных человеческим фактором (разработчиком), сокращается примерно на 40%. *
- Интуитивно понятный: отличная поддержка редакторов. Автодополнение повсюду. Меньше времени на отладку.
- Простой: разработан так, чтобы им было легко пользоваться и его было легко изучать. Меньше времени на чтение документации.
- Краткий: минимум дублирования кода. Множество возможностей для каждого объявления параметра. Меньше ошибок.
- Надёжный: готовый к использованию в промышленной среде код. С автоматической интерактивной документацией.
- Основанный на стандартах: основан на открытых стандартах API и полностью с ними совместим: OpenAPI (ранее известном как Swagger) и JSON Schema.
* оценка основана на тестах, проведённых внутренней командой разработчиков при создании приложений для промышленной среды.
Мнения
«В последнее время я очень часто использую FastAPI. Я планирую использовать его для всех сервисов машинного обучения моей команды в Microsoft. Некоторые из них интегрируются в основной продукт Windows и некоторые продукты Office».
«Мы выбрали библиотеку FastAPI, чтобы запустить сервер REST, к которому можно обращаться для получения предсказаний». [для Ludwig]
«Netflix с радостью объявляет об открытии исходного кода нашей платформы оркестрации управления кризисами: Dispatch!» [создана с помощью FastAPI]
«Если кто-то хочет создать API на Python для промышленной среды, я настоятельно рекомендую FastAPI. Он прекрасно спроектирован, прост в использовании и легко масштабируется — он стал ключевым компонентом нашей стратегии разработки API-first».
«[...] В последнее время я очень часто использую FastAPI. [...] Я планирую использовать его для всех сервисов машинного обучения моей команды в Microsoft. Некоторые из них интегрируются в основной продукт Windows и некоторые продукты Office.»
«Мы выбрали библиотеку FastAPI, чтобы запустить сервер REST, к которому можно обращаться для получения предсказаний. [для Ludwig]»
«Netflix с радостью объявляет об открытии исходного кода нашей платформы оркестрации управления кризисами: Dispatch! [создана с помощью FastAPI]»
«Если кто-то хочет создать API на Python для промышленной среды, я настоятельно рекомендую FastAPI. Он прекрасно спроектирован, прост в использовании и легко масштабируется. Он стал ключевым компонентом нашей стратегии разработки API-first и обеспечивает работу многих средств автоматизации и сервисов, например нашего виртуального инженера TAC.»
Мини-документальный фильм о FastAPI
В конце 2025 года вышел мини-документальный фильм о FastAPI, его можно посмотреть онлайн:
Typer — FastAPI для CLI
Если вы создаёте приложение CLI для использования в терминале, а не веб-API, обратите внимание на Typer.
Typer — младший брат FastAPI. Он задуман как FastAPI для CLI. ⌨️ 🚀
Требования
FastAPI опирается на плечи гигантов:
Установка
Сначала установите uv, а затем добавьте FastAPI в свой проект:
$ uv add "fastapi[standard]"
---> 100%
Примечание: заключите "fastapi[standard]" в кавычки, чтобы команда работала во всех терминалах.
Если вы предпочитаете использовать pip, установите fastapi[standard] в виртуальной среде. Альтернативные шаги описаны в руководстве по установке.
Пример
Создайте приложение
Создайте файл main.py со следующим содержимым:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
Или используйте async def...
Если ваш код использует async / await, используйте async def:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
Примечание:
Если вы не знаете, загляните в раздел «Спешите?» о том, как использовать async и await в документации.
Запустите приложение
Запустите сервер командой:
$ uv run fastapi dev
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
О команде fastapi dev...
Команда fastapi dev автоматически читает ваш файл main.py, находит в нём приложение FastAPI и запускает сервер с помощью Uvicorn.
По умолчанию fastapi dev запускается с включённой автоматической перезагрузкой для локальной разработки.
Подробнее об этом читайте в документации по FastAPI CLI.
Проверьте приложение
Откройте в браузере адрес http://127.0.0.1:8000/items/5?q=somequery.
Вы увидите следующий ответ JSON:
{"item_id": 5, "q": "somequery"}
Вы уже создали API, который:
- Получает HTTP-запросы по путям пути
/и/items/{item_id}. - Для обоих путей поддерживаются
GETоперации (также известные как HTTP-методы). - В пути путь
/items/{item_id}есть параметр путиitem_id, который должен иметь типint. - В пути путь
/items/{item_id}есть необязательный параметр запросаqтипаstr.
Интерактивная документация API
Теперь перейдите по адресу http://127.0.0.1:8000/docs.
Вы увидите автоматически созданную интерактивную документацию API (предоставленную Swagger UI):
Альтернативная документация API
Теперь перейдите по адресу http://127.0.0.1:8000/redoc.
Вы увидите альтернативную автоматически созданную документацию (предоставленную ReDoc):
Дополнение примера
Теперь измените файл main.py, чтобы он принимал тело запроса PUT.
Объявите тело запроса с помощью стандартных типов Python — благодаря Pydantic.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
Сервер fastapi dev должен перезагрузиться автоматически.
Обновление интерактивной документации API
Теперь перейдите по адресу http://127.0.0.1:8000/docs.
- Интерактивная документация API обновится автоматически, включая новое тело запроса:
- Нажмите кнопку «Попробовать», чтобы заполнить параметры и напрямую взаимодействовать с API:
- Затем нажмите кнопку «Выполнить»: пользовательский интерфейс свяжется с вашим API, отправит параметры, получит результаты и покажет их на экране:
Обновление альтернативной документации API
Теперь перейдите по адресу http://127.0.0.1:8000/redoc.
- В альтернативной документации также отобразятся новый параметр запроса и тело запроса:
Итоги
Итак, вы один раз объявляете типы параметров, тела запроса и т. д. в качестве параметров функции.
Для этого используются стандартные современные типы Python.
Вам не нужно изучать новый синтаксис, методы или классы конкретной библиотеки и т. д.
Только стандартный Python.
Например, для int:
item_id: int
или для более сложной модели Item:
item: Item
...и благодаря этому единственному объявлению вы получаете:
- Поддержку редактора, включая:
- Автодополнение.
- Проверку типов.
- Проверку данных:
- Автоматические и понятные сообщения об ошибках, если данные некорректны.
- Проверку даже глубоко вложенных объектов JSON.
-
Преобразование входных данных: из сетевых данных в данные и типы Python. Чтение из:
- JSON.
- Параметров пути.
- Параметров запроса.
- Файлов cookie.
- Заголовков.
- Форм.
- Файлов.
-
Преобразование выходных данных: из данных и типов Python в сетевые данные (например, JSON):
- Преобразование типов Python (
str,int,float,bool,listи т. д.). -
Объектов
datetime. -
Объектов
UUID. - Моделей баз данных.
- ...и многого другого.
- Преобразование типов Python (
- Автоматическую интерактивную документацию API с двумя альтернативными пользовательскими интерфейсами:
- Swagger UI.
- ReDoc.
Вернёмся к предыдущему примеру кода. FastAPI выполнит следующие действия:
- Проверит, что в пути для запросов
GETиPUTесть параметрitem_id. - Проверит, что
item_idимеет типintдля запросовGETиPUT.- Если это не так, клиент получит понятное и полезное сообщение об ошибке.
- Проверит, есть ли необязательный параметр запроса с именем
q(как вhttp://127.0.0.1:8000/items/foo?q=somequery) для запросовGET.- Поскольку параметр
qобъявлен с помощью= None, он является необязательным. - Без
Noneон был бы обязательным (как тело запроса в случае сPUT).
- Поскольку параметр
- Для запросов
PUTк/items/{item_id}прочитает тело как JSON:- Проверит, что оно содержит обязательный атрибут
nameтипаstr. - Проверит, что оно содержит обязательный атрибут
priceтипаfloat. - Проверит, что оно содержит необязательный атрибут
is_offerтипаbool, если он указан. - Всё это будет работать и с глубоко вложенными объектами JSON.
- Проверит, что оно содержит обязательный атрибут
- Автоматически преобразует данные из JSON и обратно.
- Документирует всё с помощью OpenAPI, который можно использовать в:
- Системах интерактивной документации.
- Системах автоматической генерации клиентского кода для многих языков.
- Предоставит два интерактивных веб-интерфейса документации.
Мы лишь слегка коснулись темы, но вы уже поняли, как всё работает.
Попробуйте изменить строку:
return {"item_name": item.name, "item_id": item_id}
...с:
... "item_name": item.name ...
...на:
... "item_price": item.price ...
...и посмотрите, как редактор будет автоматически дополнять атрибуты и определять их типы:
Более полный пример с дополнительными возможностями смотрите в руководстве — руководстве пользователя.
Спойлер: руководство — руководство пользователя включает:
- Объявление параметров из разных источников, например: заголовков, файлов cookie, полей формы и файлов.
- Настройку ограничений проверки, например
maximum_lengthилиregex. - Мощную и простую в использовании систему внедрения зависимостей.
- Безопасность и аутентификацию, включая поддержку OAuth2 с токенами JWT и аутентификацией HTTP Basic.
- Более продвинутые (но такие же простые) способы объявления глубоко вложенных моделей JSON (благодаря Pydantic).
- Интеграцию с GraphQL с помощью Strawberry и других библиотек.
- Множество дополнительных возможностей (благодаря Starlette), например:
- WebSockets
- очень простые тесты на основе HTTPX и
pytest - CORS
- Сеансы cookie
- ...и многое другое.
Развёртывание приложения (необязательно)
При желании вы можете развернуть приложение FastAPI в FastAPI Cloud одной командой. 🚀
$ uv run fastapi deploy
Deploying to FastAPI Cloud...
✅ Deployment successful!
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
CLI автоматически найдёт ваше приложение FastAPI и развернёт его в облаке. Если вы не вошли в систему, откроется браузер, чтобы завершить процесс аутентификации.
Вот и всё! Теперь приложение доступно по этому URL. ✨
О FastAPI Cloud
FastAPI Cloud создан автором и командой, стоящими за FastAPI.
Сервис упрощает создание, развёртывание и доступ к API, требуя минимальных усилий.
Он переносит тот же опыт разработки приложений с FastAPI на их развёртывание в облаке. 🎉
FastAPI Cloud — основной спонсор и источник финансирования проектов с открытым исходным кодом FastAPI и друзья. ✨
Развёртывание у других облачных провайдеров
FastAPI имеет открытый исходный код и основан на стандартах. Вы можете развернуть приложения FastAPI у любого облачного провайдера на свой выбор.
Следуйте инструкциям вашего облачного провайдера по развёртыванию приложений FastAPI. 🤓
Производительность
Независимые тесты TechEmpower показывают, что приложения FastAPI, работающие под управлением Uvicorn, входят в число самых быстрых доступных фреймворков Python и уступают только Starlette и самому Uvicorn (который FastAPI использует внутри). (*)
Подробнее об этом читайте в разделе Тесты производительности.
Зависимости
FastAPI зависит от Pydantic и Starlette.
standard Зависимости
При установке FastAPI с помощью uv add "fastapi[standard]" устанавливается группа дополнительных зависимостей standard:
Используются Pydantic:
-
email-validator— для проверки адресов электронной почты.
Используются Starlette:
-
httpx— требуется, если вы хотите использоватьTestClient. -
jinja2— требуется, если вы хотите использовать конфигурацию шаблонов по умолчанию. -
python-multipart— требуется для поддержки «разбора» форм с помощьюrequest.form().
Используются FastAPI:
-
uvicorn— сервер, который загружает и обслуживает ваше приложение. В него входитuvicorn[standard], содержащий некоторые зависимости (например,uvloop), необходимые для высокопроизводительного обслуживания. -
fastapi-cli[standard]— для предоставления командыfastapi.- В неё входит
fastapi-cloud-cli, позволяющий развернуть приложение FastAPI в FastAPI Cloud.
- В неё входит
Без зависимостей standard
Если вы не хотите устанавливать дополнительные зависимости standard, используйте для установки uv add fastapi вместо uv add "fastapi[standard]".
Без fastapi-cloud-cli
Если вы хотите установить FastAPI со стандартными зависимостями, но без fastapi-cloud-cli, используйте для установки uv add "fastapi[standard-no-fastapi-cloud-cli]".
Дополнительные необязательные зависимости
Возможно, вам понадобятся некоторые дополнительные зависимости.
Дополнительные необязательные зависимости Pydantic:
-
pydantic-settings— для управления настройками. -
pydantic-extra-types— дополнительные типы для использования с Pydantic.
Дополнительные необязательные зависимости FastAPI:
-
orjson— требуется, если вы хотите использоватьORJSONResponse. -
ujson— требуется, если вы хотите использоватьUJSONResponse.
Лицензия
Этот проект распространяется на условиях лицензии MIT.
© 2018 Sebastián Ramírez
Licensed under the MIT License.
https://fastapi.tiangolo.com/
