Browse Source
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sebastián Ramírez <[email protected]>pull/9394/head
committed by
GitHub
2 changed files with 461 additions and 0 deletions
@ -0,0 +1,460 @@ |
|||
# Альтернативы, источники вдохновения и сравнения |
|||
|
|||
Что вдохновило на создание **FastAPI**, сравнение его с альтернативами и чему он научился у них. |
|||
|
|||
## Введение |
|||
|
|||
**FastAPI** не существовал бы, если б не было более ранних работ других людей. |
|||
|
|||
Они создали большое количество инструментов, которые вдохновили меня на создание **FastAPI**. |
|||
|
|||
Я всячески избегал создания нового фреймворка в течение нескольких лет. |
|||
Сначала я пытался собрать все нужные функции, которые ныне есть в **FastAPI**, используя множество различных фреймворков, плагинов и инструментов. |
|||
|
|||
Но в какой-то момент не осталось другого выбора, кроме как создать что-то, что предоставляло бы все эти функции сразу. |
|||
Взять самые лучшие идеи из предыдущих инструментов и, используя новые возможности Python (которых не было до версии 3.6, то есть подсказки типов), объединить их. |
|||
|
|||
## Предшествующие инструменты |
|||
|
|||
### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> |
|||
|
|||
Это самый популярный Python-фреймворк, и он пользуется доверием. |
|||
Он используется для создания проектов типа Instagram. |
|||
|
|||
Django довольно тесно связан с реляционными базами данных (такими как MySQL или PostgreSQL), потому использовать NoSQL базы данных (например, Couchbase, MongoDB, Cassandra и т.п.) в качестве основного хранилища данных - непросто. |
|||
|
|||
Он был создан для генерации HTML-страниц на сервере, а не для создания API, используемых современными веб-интерфейсами (React, Vue.js, Angular и т.п.) или другими системами (например, <abbr title="Интернет вещей">IoT</abbr>) взаимодействующими с сервером. |
|||
|
|||
### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a> |
|||
|
|||
Фреймворк Django REST был создан, как гибкий инструментарий для создания веб-API на основе Django. |
|||
|
|||
DRF использовался многими компаниями, включая Mozilla, Red Hat и Eventbrite. |
|||
|
|||
Это был один из первых примеров **автоматического документирования API** и это была одна из первых идей, вдохновивших на создание **FastAPI**. |
|||
|
|||
!!! note "Заметка" |
|||
Django REST Framework был создан Tom Christie. |
|||
Он же создал Starlette и Uvicorn, на которых основан **FastAPI**. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Должно быть автоматическое создание документации API с пользовательским веб-интерфейсом. |
|||
|
|||
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> |
|||
|
|||
Flask - это "микрофреймворк", в нём нет интеграции с базами данных и многих других вещей, которые предустановлены в Django. |
|||
|
|||
Его простота и гибкость дают широкие возможности, такие как использование баз данных NoSQL в качестве основной системы хранения данных. |
|||
|
|||
Он очень прост, его изучение интуитивно понятно, хотя в некоторых местах документация довольно техническая. |
|||
|
|||
Flask часто используется и для приложений, которым не нужна база данных, настройки прав доступа для пользователей и прочие из множества функций, предварительно встроенных в Django. |
|||
Хотя многие из этих функций могут быть добавлены с помощью плагинов. |
|||
|
|||
Такое разделение на части и то, что это "микрофреймворк", который можно расширить, добавляя необходимые возможности, было ключевой особенностью, которую я хотел сохранить. |
|||
|
|||
Простота Flask, показалась мне подходящей для создания API. |
|||
Но ещё нужно было найти "Django REST Framework" для Flask. |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
Это будет микрофреймворк. К нему легко будет добавить необходимые инструменты и части. |
|||
|
|||
Должна быть простая и лёгкая в использовании система маршрутизации запросов. |
|||
|
|||
|
|||
### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> |
|||
|
|||
На самом деле **FastAPI** не является альтернативой **Requests**. |
|||
Их область применения очень разная. |
|||
|
|||
В принципе, можно использовать Requests *внутри* приложения FastAPI. |
|||
|
|||
Но всё же я использовал в FastAPI некоторые идеи из Requests. |
|||
|
|||
**Requests** - это библиотека для взаимодействия с API в качестве клиента, |
|||
в то время как **FastAPI** - это библиотека для *создания* API (то есть сервера). |
|||
|
|||
Они, так или иначе, диаметрально противоположны и дополняют друг друга. |
|||
|
|||
Requests имеет очень простой и понятный дизайн, очень прост в использовании и имеет разумные значения по умолчанию. |
|||
И в то же время он очень мощный и настраиваемый. |
|||
|
|||
Вот почему на официальном сайте написано: |
|||
|
|||
> Requests - один из самых загружаемых пакетов Python всех времен |
|||
|
|||
|
|||
Использовать его очень просто. Например, чтобы выполнить запрос `GET`, Вы бы написали: |
|||
|
|||
```Python |
|||
response = requests.get("http://example.com/some/url") |
|||
``` |
|||
|
|||
Противоположная *операция пути* в FastAPI может выглядеть следующим образом: |
|||
|
|||
```Python hl_lines="1" |
|||
@app.get("/some/url") |
|||
def read_url(): |
|||
return {"message": "Hello World"} |
|||
``` |
|||
|
|||
Глядите, как похоже `requests.get(...)` и `@app.get(...)`. |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
* Должен быть простой и понятный API. |
|||
* Нужно использовать названия HTTP-методов (операций) для упрощения понимания происходящего. |
|||
* Должны быть разумные настройки по умолчанию и широкие возможности их кастомизации. |
|||
|
|||
|
|||
### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> |
|||
|
|||
Главной функцией, которую я хотел унаследовать от Django REST Framework, была автоматическая документация API. |
|||
|
|||
Но потом я обнаружил, что существует стандарт документирования API, использующий JSON (или YAML, расширение JSON) под названием Swagger. |
|||
|
|||
И к нему уже был создан пользовательский веб-интерфейс. |
|||
Таким образом, возможность генерировать документацию Swagger для API позволила бы использовать этот интерфейс. |
|||
|
|||
В какой-то момент Swagger был передан Linux Foundation и переименован в OpenAPI. |
|||
|
|||
Вот почему, когда говорят о версии 2.0, обычно говорят "Swagger", а для версии 3+ "OpenAPI". |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
Использовать открытые стандарты для спецификаций API вместо самодельных схем. |
|||
|
|||
Совместимость с основанными на стандартах пользовательскими интерфейсами: |
|||
|
|||
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> |
|||
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> |
|||
|
|||
Они были выбраны за популярность и стабильность. |
|||
Но сделав беглый поиск, Вы можете найти десятки альтернативных пользовательских интерфейсов для OpenAPI, которые Вы можете использовать с **FastAPI**. |
|||
|
|||
### REST фреймворки для Flask |
|||
|
|||
Существует несколько REST фреймворков для Flask, но потратив время и усилия на их изучение, я обнаружил, что многие из них не обновляются или заброшены и имеют нерешённые проблемы из-за которых они непригодны к использованию. |
|||
|
|||
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> |
|||
|
|||
Одной из основных функций, необходимых системам API, является "<abbr title="также называют маршаллингом или преобразованием">сериализация</abbr>" данных, то есть преобразование данных из кода (Python) во что-то, что может быть отправлено по сети. |
|||
Например, превращение объекта содержащего данные из базы данных в объект JSON, конвертация объекта `datetime` в строку и т.п. |
|||
|
|||
Еще одна важная функция, необходимая API — проверка данных, позволяющая убедиться, что данные действительны и соответствуют заданным параметрам. |
|||
Как пример, можно указать, что ожидаются данные типа `int`, а не какая-то произвольная строка. |
|||
Это особенно полезно для входящих данных. |
|||
|
|||
Без системы проверки данных Вам пришлось бы прописывать все проверки вручную. |
|||
|
|||
Именно для обеспечения этих функций и была создана Marshmallow. |
|||
Это отличная библиотека и я много раз пользовался ею раньше. |
|||
|
|||
Но она была создана до того, как появились подсказки типов Python. |
|||
Итак, чтобы определить каждую <abbr title="Формат данных">схему</abbr>, |
|||
Вам нужно использовать определенные утилиты и классы, предоставляемые Marshmallow. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Использовать код программы для автоматического создания "схем", определяющих типы данных и их проверку. |
|||
|
|||
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> |
|||
|
|||
Другая немаловажная функция API - <abbr title="чтение и преобразование данных в объекты Python">парсинг</abbr> данных из входящих запросов. |
|||
|
|||
Webargs - это инструмент, который был создан для этого и поддерживает несколько фреймворков, включая Flask. |
|||
|
|||
Для проверки данных он использует Marshmallow и создан теми же авторами. |
|||
|
|||
Это превосходный инструмент и я тоже часто пользовался им до **FastAPI**. |
|||
|
|||
!!! info "Информация" |
|||
Webargs бы создан разработчиками Marshmallow. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Должна быть автоматическая проверка входных данных. |
|||
|
|||
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> |
|||
|
|||
Marshmallow и Webargs осуществляют проверку, анализ и сериализацию данных как плагины. |
|||
|
|||
Но документации API всё ещё не было. Тогда был создан APISpec. |
|||
|
|||
Это плагин для множества фреймворков, в том числе и для Starlette. |
|||
|
|||
Он работает так - Вы записываете определение схем, используя формат YAML, внутри докстринга каждой функции, обрабатывающей маршрут. |
|||
|
|||
Используя эти докстринги, он генерирует схему OpenAPI. |
|||
|
|||
Так это работает для Flask, Starlette, Responder и т.п. |
|||
|
|||
Но теперь у нас возникает новая проблема - наличие постороннего микро-синтаксиса внутри кода Python (большие YAML). |
|||
|
|||
Редактор кода не особо может помочь в такой парадигме. |
|||
А изменив какие-то параметры или схемы для Marshmallow можно забыть отредактировать докстринг с YAML и сгенерированная схема становится недействительной. |
|||
|
|||
!!! info "Информация" |
|||
APISpec тоже был создан авторами Marshmallow. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Необходима поддержка открытого стандарта для API - OpenAPI. |
|||
|
|||
### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> |
|||
|
|||
Это плагин для Flask, который связан с Webargs, Marshmallow и APISpec. |
|||
|
|||
Он получает информацию от Webargs и Marshmallow, а затем использует APISpec для автоматического создания схемы OpenAPI. |
|||
|
|||
Это отличный, но крайне недооценённый инструмент. |
|||
Он должен быть более популярен, чем многие плагины для Flask. |
|||
Возможно, это связано с тем, что его документация слишком скудна и абстрактна. |
|||
|
|||
Он избавил от необходимости писать чужеродный синтаксис YAML внутри докстрингов. |
|||
|
|||
Такое сочетание Flask, Flask-apispec, Marshmallow и Webargs было моим любимым стеком при построении бэкенда до появления **FastAPI**. |
|||
|
|||
Использование этого стека привело к созданию нескольких генераторов проектов. Я и некоторые другие команды до сих пор используем их: |
|||
|
|||
* <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a> |
|||
* <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a> |
|||
* <a href="https://github.com/tiangolo/full-stack-flask-couchdb" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchdb</a> |
|||
|
|||
Эти генераторы проектов также стали основой для [Генераторов проектов с **FastAPI**](project-generation.md){.internal-link target=_blank}. |
|||
|
|||
!!! info "Информация" |
|||
Как ни странно, но Flask-apispec тоже создан авторами Marshmallow. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Схема OpenAPI должна создаваться автоматически и использовать тот же код, который осуществляет сериализацию и проверку данных. |
|||
|
|||
### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (и <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) |
|||
|
|||
Здесь даже не используется Python. NestJS - этот фреймворк написанный на JavaScript (TypeScript), основанный на NodeJS и вдохновлённый Angular. |
|||
|
|||
Он позволяет получить нечто похожее на то, что можно сделать с помощью Flask-apispec. |
|||
|
|||
В него встроена система внедрения зависимостей, ещё одна идея взятая от Angular. |
|||
Однако требуется предварительная регистрация "внедрений" (как и во всех других известных мне системах внедрения зависимостей), что увеличивает количество и повторяемость кода. |
|||
|
|||
Так как параметры в нём описываются с помощью типов TypeScript (аналогично подсказкам типов в Python), поддержка редактора работает довольно хорошо. |
|||
|
|||
Но поскольку данные из TypeScript не сохраняются после компиляции в JavaScript, он не может полагаться на подсказки типов для определения проверки данных, сериализации и документации. |
|||
Из-за этого и некоторых дизайнерских решений, для валидации, сериализации и автоматической генерации схем, приходится во многих местах добавлять декораторы. |
|||
Таким образом, это становится довольно многословным. |
|||
|
|||
Кроме того, он не очень хорошо справляется с вложенными моделями. |
|||
Если в запросе имеется объект JSON, внутренние поля которого, в свою очередь, являются вложенными объектами JSON, это не может быть должным образом задокументировано и проверено. |
|||
|
|||
!!! check "Идеи для **FastAPI** " |
|||
Нужно использовать подсказки типов, чтоб воспользоваться поддержкой редактора кода. |
|||
|
|||
Нужна мощная система внедрения зависимостей. Необходим способ для уменьшения повторов кода. |
|||
|
|||
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> |
|||
|
|||
Sanic был одним из первых чрезвычайно быстрых Python-фреймворков основанных на `asyncio`. |
|||
Он был сделан очень похожим на Flask. |
|||
|
|||
!!! note "Технические детали" |
|||
В нём использован <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> вместо стандартного цикла событий `asyncio`, что и сделало его таким быстрым. |
|||
|
|||
Он явно вдохновил создателей Uvicorn и Starlette, которые в настоящее время быстрее Sanic в открытых бенчмарках. |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
Должна быть сумасшедшая производительность. |
|||
|
|||
Для этого **FastAPI** основан на Starlette, самом быстром из доступных фреймворков (по замерам незаинтересованных лиц). |
|||
|
|||
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> |
|||
|
|||
Falcon - ещё один высокопроизводительный Python-фреймворк. |
|||
В нём минимум функций и он создан, чтоб быть основой для других фреймворков, например, Hug. |
|||
|
|||
Функции в нём получают два параметра - "запрос к серверу" и "ответ сервера". |
|||
Затем Вы "читаете" часть запроса и "пишите" часть ответа. |
|||
Из-за такой конструкции невозможно объявить параметры запроса и тела сообщения со стандартными подсказками типов Python в качестве параметров функции. |
|||
|
|||
Таким образом, и валидацию данных, и их сериализацию, и документацию нужно прописывать вручную. |
|||
Либо эти функции должны быть встроены во фреймворк, сконструированный поверх Falcon, как в Hug. |
|||
Такая же особенность присутствует и в других фреймворках, вдохновлённых идеей Falcon, использовать только один объект запроса и один объект ответа. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Найдите способы добиться отличной производительности. |
|||
|
|||
Объявлять параметры `ответа сервера` в функциях, как в Hug. |
|||
|
|||
Хотя в FastAPI это необязательно и используется в основном для установки заголовков, куки и альтернативных кодов состояния. |
|||
|
|||
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> |
|||
|
|||
Molten мне попался на начальной стадии написания **FastAPI**. В нём были похожие идеи: |
|||
|
|||
* Использование подсказок типов. |
|||
* Валидация и документация исходя из этих подсказок. |
|||
* Система внедрения зависимостей. |
|||
|
|||
В нём не используются сторонние библиотеки (такие, как Pydantic) для валидации, сериализации и документации. |
|||
Поэтому переиспользовать эти определения типов непросто. |
|||
|
|||
Также требуется более подробная конфигурация и используется стандарт WSGI, который не предназначен для использования с высокопроизводительными инструментами, такими как Uvicorn, Starlette и Sanic, в отличие от ASGI. |
|||
|
|||
Его система внедрения зависимостей требует предварительной регистрации, и зависимости определяются, как объявления типов. |
|||
Из-за этого невозможно объявить более одного "компонента" (зависимости), который предоставляет определенный тип. |
|||
|
|||
Маршруты объявляются в единственном месте с использованием функций, объявленных в других местах (вместо использования декораторов, в которые могут быть обёрнуты функции, обрабатывающие конкретные ресурсы). |
|||
Это больше похоже на Django, чем на Flask и Starlette. |
|||
Он разделяет в коде вещи, которые довольно тесно связаны. |
|||
|
|||
!!! check "Идея для **FastAPI**" |
|||
Определить дополнительные проверки типов данных, используя значения атрибутов модели "по умолчанию". |
|||
Это улучшает помощь редактора и раньше это не было доступно в Pydantic. |
|||
|
|||
Фактически это подтолкнуло на обновление Pydantic для поддержки одинакового стиля проверок (теперь этот функционал уже доступен в Pydantic). |
|||
|
|||
### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a> |
|||
|
|||
Hug был одним из первых фреймворков, реализовавших объявление параметров API с использованием подсказок типов Python. |
|||
Эта отличная идея была использована и другими инструментами. |
|||
|
|||
При объявлении параметров вместо стандартных типов Python использовались собственные типы, но всё же это был огромный шаг вперед. |
|||
|
|||
Это также был один из первых фреймворков, генерировавших полную API-схему в формате JSON. |
|||
|
|||
Данная схема не придерживалась стандартов вроде OpenAPI и JSON Schema. |
|||
Поэтому было бы непросто совместить её с другими инструментами, такими как Swagger UI. |
|||
Но опять же, это была очень инновационная идея. |
|||
|
|||
Ещё у него есть интересная и необычная функция: используя один и тот же фреймворк можно создавать и API, и <abbr title="Интерфейс командной строки">CLI</abbr>. |
|||
|
|||
Поскольку он основан на WSGI, старом стандарте для синхронных веб-фреймворков, он не может работать с веб-сокетами и другими модными штуками, но всё равно обладает высокой производительностью. |
|||
|
|||
!!! info "Информация" |
|||
Hug создан Timothy Crosley, автором <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, отличного инструмента для автоматической сортировки импортов в Python-файлах. |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
Hug повлиял на создание некоторых частей APIStar и был одним из инструментов, которые я счел наиболее многообещающими, наряду с APIStar. |
|||
|
|||
Hug натолкнул на мысли использовать в **FastAPI** подсказки типов Python для автоматического создания схемы, определяющей API и его параметры. |
|||
|
|||
Hug вдохновил **FastAPI** объявить параметр `ответа` в функциях для установки заголовков и куки. |
|||
|
|||
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5) |
|||
|
|||
Непосредственно перед тем, как принять решение о создании **FastAPI**, я обнаружил **APIStar**. |
|||
В нем было почти все, что я искал и у него был отличный дизайн. |
|||
|
|||
Это была одна из первых реализаций фреймворка, использующего подсказки типов для объявления параметров и запросов, которые я когда-либо видел (до NestJS и Molten). |
|||
Я нашёл его примерно в то же время, что и Hug, но APIStar использовал стандарт OpenAPI. |
|||
|
|||
В нём были автоматические проверка и сериализация данных и генерация схемы OpenAPI основанные на подсказках типов в нескольких местах. |
|||
|
|||
При определении схемы тела сообщения не использовались подсказки типов, как в Pydantic, это больше похоже на Marshmallow, поэтому помощь редактора была недостаточно хорошей, но всё же APIStar был лучшим доступным вариантом. |
|||
|
|||
На тот момент у него были лучшие показатели производительности (проигрывающие только Starlette). |
|||
|
|||
Изначально у него не было автоматической документации API для веб-интерфейса, но я знал, что могу добавить к нему Swagger UI. |
|||
|
|||
В APIStar была система внедрения зависимостей, которая тоже требовала предварительную регистрацию компонентов, как и ранее описанные инструменты. |
|||
Но, тем не менее, это была отличная штука. |
|||
|
|||
Я не смог использовать его в полноценном проекте, так как были проблемы со встраиванием <abbr title="Авторизация и соответствующие допуски к операциям пути (эндпоинтам)">функций безопасности</abbr> в схему OpenAPI, из-за которых невозможно было встроить все функции, применяемые в генераторах проектов на основе Flask-apispec. |
|||
Я добавил в свой список задач создание пул-реквеста, добавляющего эту функциональность. |
|||
|
|||
В дальнейшем фокус проекта сместился. |
|||
|
|||
Это больше не был API-фреймворк, так как автор сосредоточился на Starlette. |
|||
|
|||
Ныне APIStar - это набор инструментов для проверки спецификаций OpenAPI. |
|||
|
|||
!!! info "Информация" |
|||
APIStar был создан Tom Christie. Тот самый парень, который создал: |
|||
|
|||
* Django REST Framework |
|||
* Starlette (на котором основан **FastAPI**) |
|||
* Uvicorn (используемый в Starlette и **FastAPI**) |
|||
|
|||
!!! check "Идеи для **FastAPI**" |
|||
Воплощение. |
|||
|
|||
Мне казалось блестящей идеей объявлять множество функций (проверка данных, сериализация, документация) с помощью одних и тех же типов Python, которые при этом обеспечивают ещё и помощь редактора кода. |
|||
|
|||
После долгих поисков среди похожих друг на друга фреймворков и сравнения их различий, APIStar стал самым лучшим выбором. |
|||
|
|||
Но APIStar перестал быть фреймворком для создания веб-сервера, зато появился Starlette, новая и лучшая основа для построения подобных систем. |
|||
Это была последняя капля, сподвигнувшая на создание **FastAPI**. |
|||
|
|||
Я считаю **FastAPI** "духовным преемником" APIStar, улучившим его возможности благодаря урокам, извлечённым из всех упомянутых выше инструментов. |
|||
|
|||
## Что используется в **FastAPI** |
|||
|
|||
### <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> |
|||
|
|||
Pydantic - это библиотека для валидации данных, сериализации и документирования (используя JSON Schema), основываясь на подсказках типов Python, что делает его чрезвычайно интуитивным. |
|||
|
|||
Его можно сравнить с Marshmallow, хотя в бенчмарках Pydantic быстрее, чем Marshmallow. |
|||
И он основан на тех же подсказках типов, которые отлично поддерживаются редакторами кода. |
|||
|
|||
!!! check "**FastAPI** использует Pydantic" |
|||
Для проверки данных, сериализации данных и автоматической документации моделей (на основе JSON Schema). |
|||
|
|||
Затем **FastAPI** берёт эти схемы JSON и помещает их в схему OpenAPI, не касаясь других вещей, которые он делает. |
|||
|
|||
### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> |
|||
|
|||
Starlette - это легковесный <abbr title="Новый стандарт построения асинхронных веб-сервисов Python">ASGI</abbr> фреймворк/набор инструментов, который идеален для построения высокопроизводительных асинхронных сервисов. |
|||
|
|||
Starlette очень простой и интуитивный. |
|||
Он разработан таким образом, чтобы быть легко расширяемым и иметь модульные компоненты. |
|||
|
|||
В нём есть: |
|||
|
|||
* Впечатляющая производительность. |
|||
* Поддержка веб-сокетов. |
|||
* Фоновые задачи. |
|||
* Обработка событий при старте и финише приложения. |
|||
* Тестовый клиент на основе HTTPX. |
|||
* Поддержка CORS, сжатие GZip, статические файлы, потоковая передача данных. |
|||
* Поддержка сессий и куки. |
|||
* 100% покрытие тестами. |
|||
* 100% аннотированный код. |
|||
* Несколько жёстких зависимостей. |
|||
|
|||
В настоящее время Starlette показывает самую высокую скорость среди Python-фреймворков в тестовых замерах. |
|||
Быстрее только Uvicorn, который является сервером, а не фреймворком. |
|||
|
|||
Starlette обеспечивает весь функционал микрофреймворка, но не предоставляет автоматическую валидацию данных, сериализацию и документацию. |
|||
|
|||
**FastAPI** добавляет эти функции используя подсказки типов Python и Pydantic. |
|||
Ещё **FastAPI** добавляет систему внедрения зависимостей, утилиты безопасности, генерацию схемы OpenAPI и т.д. |
|||
|
|||
!!! note "Технические детали" |
|||
ASGI - это новый "стандарт" разработанный участниками команды Django. |
|||
Он пока что не является "стандартом в Python" (то есть принятым PEP), но процесс принятия запущен. |
|||
|
|||
Тем не менее он уже используется в качестве "стандарта" несколькими инструментами. |
|||
Это значительно улучшает совместимость, поскольку Вы можете переключиться с Uvicorn на любой другой ASGI-сервер (например, Daphne или Hypercorn) или Вы можете добавить ASGI-совместимые инструменты, такие как `python-socketio`. |
|||
|
|||
!!! check "**FastAPI** использует Starlette" |
|||
В качестве ядра веб-сервиса для обработки запросов, добавив некоторые функции сверху. |
|||
|
|||
Класс `FastAPI` наследуется напрямую от класса `Starlette`. |
|||
|
|||
Таким образом, всё что Вы могли делать со Starlette, Вы можете делать с **FastAPI**, по сути это прокачанный Starlette. |
|||
|
|||
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a> |
|||
|
|||
Uvicorn - это молниеносный ASGI-сервер, построенный на uvloop и httptools. |
|||
|
|||
Uvicorn является сервером, а не фреймворком. |
|||
Например, он не предоставляет инструментов для маршрутизации запросов по ресурсам. |
|||
Для этого нужна надстройка, такая как Starlette (или **FastAPI**). |
|||
|
|||
Он рекомендуется в качестве сервера для Starlette и **FastAPI**. |
|||
|
|||
!!! check "**FastAPI** рекомендует его" |
|||
Как основной сервер для запуска приложения **FastAPI**. |
|||
|
|||
Вы можете объединить его с Gunicorn, чтобы иметь асинхронный многопроцессный сервер. |
|||
|
|||
Узнать больше деталей можно в разделе [Развёртывание](deployment/index.md){.internal-link target=_blank}. |
|||
|
|||
## Тестовые замеры и скорость |
|||
|
|||
Чтобы понять, сравнить и увидеть разницу между Uvicorn, Starlette и FastAPI, ознакомьтесь с разделом [Тестовые замеры](benchmarks.md){.internal-link target=_blank}. |
Loading…
Reference in new issue