Spec-Zone.ru › FastAPI

FastAPI

FastAPI

Фреймворк FastAPI: высокая производительность, простота изучения, быстрая разработка, готовность к использованию в промышленной среде

Test Coverage Package version Supported Python versions


Документация: 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».
— Kabir Khan, Microsoft (источник)
«Мы выбрали библиотеку FastAPI, чтобы запустить сервер REST, к которому можно обращаться для получения предсказаний». [для Ludwig]
— Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, Uber (источник)
«Netflix с радостью объявляет об открытии исходного кода нашей платформы оркестрации управления кризисами: Dispatch!» [создана с помощью FastAPI]
— Kevin Glisson, Marc Vilanova, Forest Monsen, Netflix (источник)
«Если кто-то хочет создать API на Python для промышленной среды, я настоятельно рекомендую FastAPI. Он прекрасно спроектирован, прост в использовании и легко масштабируется — он стал ключевым компонентом нашей стратегии разработки API-first».
— Deon Pillsbury, Cisco (источник)

«[...] В последнее время я очень часто использую FastAPI. [...] Я планирую использовать его для всех сервисов машинного обучения моей команды в Microsoft. Некоторые из них интегрируются в основной продукт Windows и некоторые продукты Office.»

Kabir Khan — Microsoft (источник)

«Мы выбрали библиотеку FastAPI, чтобы запустить сервер REST, к которому можно обращаться для получения предсказаний. [для Ludwig]»

Piero Molino, Yaroslav Dudin и Sai Sumanth Miryala — Uber (источник)

«Netflix с радостью объявляет об открытии исходного кода нашей платформы оркестрации управления кризисами: Dispatch! [создана с помощью FastAPI]»

Kevin Glisson, Marc Vilanova, Forest Monsen — Netflix (источник)

«Если кто-то хочет создать API на Python для промышленной среды, я настоятельно рекомендую FastAPI. Он прекрасно спроектирован, прост в использовании и легко масштабируется. Он стал ключевым компонентом нашей стратегии разработки API-first и обеспечивает работу многих средств автоматизации и сервисов, например нашего виртуального инженера TAC.»

Deon Pillsbury — Cisco (источник)

Мини-документальный фильм о FastAPI

В конце 2025 года вышел мини-документальный фильм о FastAPI, его можно посмотреть онлайн:

FastAPI Mini Documentary

Typer — FastAPI для CLI

Если вы создаёте приложение CLI для использования в терминале, а не веб-API, обратите внимание на Typer.

Typer — младший брат FastAPI. Он задуман как FastAPI для CLI. ⌨️ 🚀

Требования

FastAPI опирается на плечи гигантов:

  • Starlette для веб-компонентов.
  • Pydantic для работы с данными.

Установка

Сначала установите 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):

Swagger UI

Альтернативная документация API

Теперь перейдите по адресу http://127.0.0.1:8000/redoc.

Вы увидите альтернативную автоматически созданную документацию (предоставленную 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 обновится автоматически, включая новое тело запроса:

Swagger UI

  • Нажмите кнопку «Попробовать», чтобы заполнить параметры и напрямую взаимодействовать с API:

Swagger UI interaction

  • Затем нажмите кнопку «Выполнить»: пользовательский интерфейс свяжется с вашим API, отправит параметры, получит результаты и покажет их на экране:

Swagger UI interaction

Обновление альтернативной документации API

Теперь перейдите по адресу http://127.0.0.1:8000/redoc.

  • В альтернативной документации также отобразятся новый параметр запроса и тело запроса:

ReDoc

Итоги

Итак, вы один раз объявляете типы параметров, тела запроса и т. д. в качестве параметров функции.

Для этого используются стандартные современные типы Python.

Вам не нужно изучать новый синтаксис, методы или классы конкретной библиотеки и т. д.

Только стандартный Python.

Например, для int:

item_id: int

или для более сложной модели Item:

item: Item

...и благодаря этому единственному объявлению вы получаете:

  • Поддержку редактора, включая:
    • Автодополнение.
    • Проверку типов.
  • Проверку данных:
    • Автоматические и понятные сообщения об ошибках, если данные некорректны.
    • Проверку даже глубоко вложенных объектов JSON.
  • Преобразование входных данных: из сетевых данных в данные и типы Python. Чтение из:
    • JSON.
    • Параметров пути.
    • Параметров запроса.
    • Файлов cookie.
    • Заголовков.
    • Форм.
    • Файлов.
  • Преобразование выходных данных: из данных и типов Python в сетевые данные (например, JSON):
    • Преобразование типов Python (str, int, float, bool, list и т. д.).
    • Объектов datetime.
    • Объектов UUID.
    • Моделей баз данных.
    • ...и многого другого.
  • Автоматическую интерактивную документацию 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 ...

...и посмотрите, как редактор будет автоматически дополнять атрибуты и определять их типы:

editor support

Более полный пример с дополнительными возможностями смотрите в руководстве — руководстве пользователя.

Спойлер: руководство — руководство пользователя включает:

  • Объявление параметров из разных источников, например: заголовков, файлов 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API