mirror of https://github.com/tiangolo/fastapi.git
🌐 Add Ukrainian translation for `docs/uk/docs/alternatives.md` (#10060)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
48f6ccfe7d
commit
ad76dd1aa8
|
|
@ -0,0 +1,412 @@
|
|||
# Альтернативи, натхнення та порівняння
|
||||
|
||||
Що надихнуло на створення **FastAPI**, який він у порінянні з іншими альтернативами та чого він у них навчився.
|
||||
|
||||
## Вступ
|
||||
|
||||
**FastAPI** не існувало б, якби не попередні роботи інших.
|
||||
|
||||
Раніше було створено багато інструментів, які надихнули на його створення.
|
||||
|
||||
Я кілька років уникав створення нового фреймворку. Спочатку я спробував вирішити всі функції, охоплені **FastAPI**, використовуючи багато різних фреймворків, плагінів та інструментів.
|
||||
|
||||
Але в якийсь момент не було іншого виходу, окрім створення чогось, що надавало б усі ці функції, взявши найкращі ідеї з попередніх інструментів і поєднавши їх найкращим чином, використовуючи мовні функції, які навіть не були доступні раніше (Python 3.6+ підказки типів).
|
||||
|
||||
## Попередні інструменти
|
||||
|
||||
### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a>
|
||||
|
||||
Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram.
|
||||
|
||||
Він відносно тісно пов’язаний з реляційними базами даних (наприклад, MySQL або PostgreSQL), тому мати базу даних NoSQL (наприклад, Couchbase, MongoDB, Cassandra тощо) як основний механізм зберігання не дуже просто.
|
||||
|
||||
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbr title="Internet of Things">IoT</abbr > пристрої), які спілкуються з ним.
|
||||
|
||||
### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a>
|
||||
|
||||
Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API.
|
||||
|
||||
Його використовують багато компаній, включаючи Mozilla, Red Hat і Eventbrite.
|
||||
|
||||
Це був один із перших прикладів **автоматичної документації API**, і саме це була одна з перших ідей, яка надихнула на «пошук» **FastAPI**.
|
||||
|
||||
!!! Примітка
|
||||
Django REST Framework створив Том Крісті. Той самий творець Starlette і Uvicorn, на яких базується **FastAPI**.
|
||||
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Мати автоматичний веб-інтерфейс документації API.
|
||||
|
||||
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a>
|
||||
|
||||
Flask — це «мікрофреймворк», він не включає інтеграцію бази даних, а також багато речей, які за замовчуванням є в Django.
|
||||
|
||||
Ця простота та гнучкість дозволяють використовувати бази даних NoSQL як основну систему зберігання даних.
|
||||
|
||||
Оскільки він дуже простий, він порівняно легкий та інтуїтивний для освоєння, хоча в деяких моментах документація стає дещо технічною.
|
||||
|
||||
Він також зазвичай використовується для інших програм, яким не обов’язково потрібна база даних, керування користувачами або будь-яка з багатьох функцій, які є попередньо вбудованими в Django. Хоча багато з цих функцій можна додати за допомогою плагінів.
|
||||
|
||||
Відокремлення частин було ключовою особливістю, яку я хотів зберегти, при цьому залишаючись «мікрофреймворком», який можна розширити, щоб охопити саме те, що потрібно.
|
||||
|
||||
Враховуючи простоту Flask, він здавався хорошим підходом для створення API. Наступним, що знайшов, був «Django REST Framework» для Flask.
|
||||
|
||||
!!! Переглянте "Надихнуло **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")
|
||||
```
|
||||
|
||||
Відповідна операція *роуту* API FastAPI може виглядати так:
|
||||
|
||||
```Python hl_lines="1"
|
||||
@app.get("/some/url")
|
||||
def read_url():
|
||||
return {"message": "Hello World"}
|
||||
```
|
||||
|
||||
Зверніть увагу на схожість у `requests.get(...)` і `@app.get(...)`.
|
||||
|
||||
!!! Перегляньте "Надихнуло **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 для API дозволить використовувати цей веб-інтерфейс автоматично.
|
||||
|
||||
У якийсь момент Swagger було передано Linux Foundation, щоб перейменувати його на OpenAPI.
|
||||
|
||||
Тому, коли говорять про версію 2.0, прийнято говорити «Swagger», а про версію 3+ «OpenAPI».
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Прийняти і використовувати відкритий стандарт для специфікацій API замість спеціальної схеми.
|
||||
|
||||
Інтегрувати інструменти інтерфейсу на основі стандартів:
|
||||
|
||||
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Інтерфейс Swagger</a>
|
||||
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
|
||||
|
||||
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
|
||||
|
||||
### Фреймворки REST для Flask
|
||||
|
||||
Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними.
|
||||
|
||||
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a>
|
||||
|
||||
Однією з головних функцій, необхідних для систем API, є "<abbr title="також звана marshalling, conversion">серіалізація</abbr>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
|
||||
|
||||
Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних.
|
||||
|
||||
Без системи перевірки даних вам довелося б виконувати всі перевірки вручну, у коді.
|
||||
|
||||
Marshmallow створено для забезпечення цих функцій. Це чудова бібліотека, і я часто нею користувався раніше.
|
||||
|
||||
Але він був створений до того, як існували підказки типу Python. Отже, щоб визначити кожну <abbr title="визначення того, як дані повинні бути сформовані">схему</abbr>, вам потрібно використовувати спеціальні утиліти та класи, надані Marshmallow.
|
||||
|
||||
!!! Перегляньте "Надихнуло **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**.
|
||||
|
||||
!!! Інформація
|
||||
Webargs був створений тими ж розробниками Marshmallow.
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Мати автоматичну перевірку даних вхідного запиту.
|
||||
|
||||
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a>
|
||||
|
||||
Marshmallow і Webargs забезпечують перевірку, аналіз і серіалізацію як плагіни.
|
||||
|
||||
Але документація досі відсутня. Потім було створено APISpec.
|
||||
|
||||
Це плагін для багатьох фреймворків (також є плагін для Starlette).
|
||||
|
||||
Принцип роботи полягає в тому, що ви пишете визначення схеми, використовуючи формат YAML, у docstring кожної функції, що обробляє маршрут.
|
||||
|
||||
І він генерує схеми OpenAPI.
|
||||
|
||||
Так це працює у Flask, Starlette, Responder тощо.
|
||||
|
||||
Але потім ми знову маємо проблему наявності мікросинтаксису всередині Python строки (великий YAML).
|
||||
|
||||
Редактор тут нічим не може допомогти. І якщо ми змінимо параметри чи схеми Marshmallow і забудемо також змінити цю строку документа YAML, згенерована схема буде застарілою.
|
||||
|
||||
!!! Інформація
|
||||
APISpec був створений тими ж розробниками Marshmallow.
|
||||
|
||||
|
||||
!!! Перегляньте "Надихнуло **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 для автоматичного створення схем OpenAPI за допомогою APISpec.
|
||||
|
||||
Це чудовий інструмент, дуже недооцінений. Він має бути набагато популярнішим, ніж багато плагінів Flask. Це може бути пов’язано з тим, що його документація надто стисла й абстрактна.
|
||||
|
||||
Це вирішило необхідність писати YAML (інший синтаксис) всередині рядків документів Python.
|
||||
|
||||
Ця комбінація Flask, Flask-apispec із Marshmallow і Webargs була моїм улюбленим бекенд-стеком до створення **FastAPI**.
|
||||
|
||||
Їі використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі:
|
||||
|
||||
* <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}.
|
||||
|
||||
!!! Інформація
|
||||
Flask-apispec був створений тими ж розробниками Marshmallow.
|
||||
|
||||
!!! Перегляньте "Надихнуло **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 — це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular.
|
||||
|
||||
Це досягає чогось подібного до того, що можна зробити з Flask-apispec.
|
||||
|
||||
Він має інтегровану систему впровадження залежностей, натхненну Angular two. Він потребує попередньої реєстрації «injectables» (як і всі інші системи впровадження залежностей, які я знаю), тому це збільшує багатослівність та повторення коду.
|
||||
|
||||
Оскільки параметри описані за допомогою типів TypeScript (подібно до підказок типу Python), підтримка редактора досить хороша.
|
||||
|
||||
Але оскільки дані TypeScript не зберігаються після компіляції в JavaScript, вони не можуть покладатися на типи для визначення перевірки, серіалізації та документації одночасно. Через це та деякі дизайнерські рішення, щоб отримати перевірку, серіалізацію та автоматичну генерацію схеми, потрібно додати декоратори в багатьох місцях. Таким чином код стає досить багатослівним.
|
||||
|
||||
Він не дуже добре обробляє вкладені моделі. Отже, якщо тіло JSON у запиті є об’єктом JSON із внутрішніми полями, які, у свою чергу, є вкладеними об’єктами JSON, його неможливо належним чином задокументувати та перевірити.
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Використовувати типи Python, щоб мати чудову підтримку редактора.
|
||||
|
||||
Мати потужну систему впровадження залежностей. Знайдіть спосіб звести до мінімуму повторення коду.
|
||||
|
||||
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a>
|
||||
|
||||
Це був один із перших надзвичайно швидких фреймворків Python на основі `asyncio`. Він був дуже схожий на Flask.
|
||||
|
||||
!!! Примітка "Технічні деталі"
|
||||
Він використовував <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким.
|
||||
|
||||
Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах.
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Знайти спосіб отримати божевільну продуктивність.
|
||||
|
||||
Ось чому **FastAPI** базується на Starlette, оскільки це найшвидша доступна структура (перевірена тестами сторонніх розробників).
|
||||
|
||||
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a>
|
||||
|
||||
Falcon — ще один високопродуктивний фреймворк Python, він розроблений як мінімальний і працює як основа інших фреймворків, таких як Hug.
|
||||
|
||||
Він розроблений таким чином, щоб мати функції, які отримують два параметри, один «запит» і один «відповідь». Потім ви «читаєте» частини запиту та «записуєте» частини у відповідь. Через такий дизайн неможливо оголосити параметри запиту та тіла за допомогою стандартних підказок типу Python як параметри функції.
|
||||
|
||||
Таким чином, перевірка даних, серіалізація та документація повинні виконуватися в коді, а не автоматично. Або вони повинні бути реалізовані як фреймворк поверх Falcon, як Hug. Така сама відмінність спостерігається в інших фреймворках, натхненних дизайном Falcon, що мають один об’єкт запиту та один об’єкт відповіді як параметри.
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Знайти способи отримати чудову продуктивність.
|
||||
|
||||
Разом із Hug (оскільки Hug базується на Falcon) надихнув **FastAPI** оголосити параметр `response` у функціях.
|
||||
|
||||
Хоча у FastAPI це необов’язково, і використовується в основному для встановлення заголовків, файлів cookie та альтернативних кодів стану.
|
||||
|
||||
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a>
|
||||
|
||||
Я відкрив для себе Molten на перших етапах створення **FastAPI**. І він має досить схожі ідеї:
|
||||
|
||||
* Базується на підказках типу Python.
|
||||
* Перевірка та документація цих типів.
|
||||
* Система впровадження залежностей.
|
||||
|
||||
Він не використовує перевірку даних, серіалізацію та бібліотеку документації сторонніх розробників, як Pydantic, він має свою власну. Таким чином, ці визначення типів даних не можна було б використовувати повторно так легко.
|
||||
|
||||
Це вимагає трохи більш докладних конфігурацій. І оскільки він заснований на WSGI (замість ASGI), він не призначений для використання високопродуктивних інструментів, таких як Uvicorn, Starlette і Sanic.
|
||||
|
||||
Система впровадження залежностей вимагає попередньої реєстрації залежностей, і залежності вирішуються на основі оголошених типів. Отже, неможливо оголосити більше ніж один «компонент», який надає певний тип.
|
||||
|
||||
Маршрути оголошуються в одному місці з використанням функцій, оголошених в інших місцях (замість використання декораторів, які можна розмістити безпосередньо поверх функції, яка обробляє кінцеву точку). Це ближче до того, як це робить Django, ніж до Flask (і Starlette). Він розділяє в коді речі, які відносно тісно пов’язані.
|
||||
|
||||
!!! Перегляньте "Надихнуло **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, а також CLI.
|
||||
|
||||
Оскільки він заснований на попередньому стандарті для синхронних веб-фреймворків Python (WSGI), він не може працювати з Websockets та іншими речами, хоча він також має високу продуктивність.
|
||||
|
||||
!!! Інформація
|
||||
Hug створив Тімоті Крослі, той самий творець <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, чудовий інструмент для автоматичного сортування імпорту у файлах Python.
|
||||
|
||||
!!! Перегляньте "Надихнуло **FastAPI** на"
|
||||
Hug надихнув частину APIStar і був одним із найбільш перспективних інструментів, поряд із APIStar.
|
||||
|
||||
Hug надихнув **FastAPI** на використання підказок типу Python для оголошення параметрів і автоматичного створення схеми, що визначає API.
|
||||
|
||||
Hug надихнув **FastAPI** оголосити параметр `response` у функціях для встановлення заголовків і файлів cookie.
|
||||
|
||||
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0,5)
|
||||
|
||||
Безпосередньо перед тим, як вирішити створити **FastAPI**, я знайшов сервер **APIStar**. Він мав майже все, що я шукав, і мав чудовий дизайн.
|
||||
|
||||
Це була одна з перших реалізацій фреймворку, що використовує підказки типу Python для оголошення параметрів і запитів, яку я коли-небудь бачив (до NestJS і Molten). Я знайшов його більш-менш одночасно з Hug. Але APIStar використовував стандарт OpenAPI.
|
||||
|
||||
Він мав автоматичну перевірку даних, серіалізацію даних і генерацію схеми OpenAPI на основі підказок того самого типу в кількох місцях.
|
||||
|
||||
Визначення схеми тіла не використовували ті самі підказки типу Python, як Pydantic, воно було трохи схоже на Marshmallow, тому підтримка редактора була б не такою хорошою, але все ж APIStar був найкращим доступним варіантом.
|
||||
|
||||
Він мав найкращі показники продуктивності на той час (перевершив лише Starlette).
|
||||
|
||||
Спочатку він не мав автоматичного веб-інтерфейсу документації API, але я знав, що можу додати до нього інтерфейс користувача Swagger.
|
||||
|
||||
Він мав систему введення залежностей. Він вимагав попередньої реєстрації компонентів, як і інші інструменти, розглянуті вище. Але все одно це була чудова функція.
|
||||
|
||||
Я ніколи не міг використовувати його в повноцінному проекті, оскільки він не мав інтеграції безпеки, тому я не міг замінити всі функції, які мав, генераторами повного стеку на основі Flask-apispec. У моїх невиконаних проектах я мав створити запит на вилучення, додавши цю функцію.
|
||||
|
||||
Але потім фокус проекту змінився.
|
||||
|
||||
Це вже не був веб-фреймворк API, оскільки творцю потрібно було зосередитися на Starlette.
|
||||
|
||||
Тепер APIStar — це набір інструментів для перевірки специфікацій OpenAPI, а не веб-фреймворк.
|
||||
|
||||
!!! Інформація
|
||||
APIStar створив Том Крісті. Той самий хлопець, який створив:
|
||||
|
||||
* Django REST Framework
|
||||
* Starlette (на якому базується **FastAPI**)
|
||||
* Uvicorn (використовується Starlette і **FastAPI**)
|
||||
|
||||
!!! Перегляньте "Надихнуло **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) на основі підказок типу Python.
|
||||
|
||||
Це робить його надзвичайно інтуїтивним.
|
||||
|
||||
Його можна порівняти з Marshmallow. Хоча він швидший за Marshmallow у тестах. Оскільки він базується на тих самих підказках типу Python, підтримка редактора чудова.
|
||||
|
||||
!!! Перегляньте "**FastAPI** використовує його для"
|
||||
Виконання перевірки всіх даних, серіалізації даних і автоматичної документацію моделі (на основі схеми JSON).
|
||||
|
||||
Потім **FastAPI** бере ці дані схеми JSON і розміщує їх у OpenAPI, окремо від усіх інших речей, які він робить.
|
||||
|
||||
### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>
|
||||
|
||||
Starlette — це легкий фреймворк/набір інструментів <abbr title="The new standard for build asynchronous Python web">ASGI</abbr>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
|
||||
|
||||
Він дуже простий та інтуїтивно зрозумілий. Його розроблено таким чином, щоб його можна було легко розширювати та мати модульні компоненти.
|
||||
|
||||
Він має:
|
||||
|
||||
* Серйозно вражаючу продуктивність.
|
||||
* Підтримку WebSocket.
|
||||
* Фонові завдання в процесі.
|
||||
* Події запуску та завершення роботи.
|
||||
* Тестового клієнта, побудований на HTTPX.
|
||||
* CORS, GZip, статичні файли, потокові відповіді.
|
||||
* Підтримку сеансів і файлів cookie.
|
||||
* 100% покриття тестом.
|
||||
* 100% анотовану кодову базу.
|
||||
* Кілька жорстких залежностей.
|
||||
|
||||
Starlette наразі є найшвидшим фреймворком Python із перевірених. Перевершує лише Uvicorn, який є не фреймворком, а сервером.
|
||||
|
||||
Starlette надає всі основні функції веб-мікрофреймворку.
|
||||
|
||||
Але він не забезпечує автоматичної перевірки даних, серіалізації чи документації.
|
||||
|
||||
Це одна з головних речей, які **FastAPI** додає зверху, все на основі підказок типу Python (з використанням Pydantic). Це, а також система впровадження залежностей, утиліти безпеки, створення схеми OpenAPI тощо.
|
||||
|
||||
!!! Примітка "Технічні деталі"
|
||||
ASGI — це новий «стандарт», який розробляється членами основної команди Django. Це ще не «стандарт Python» (PEP), хоча вони в процесі цього.
|
||||
|
||||
Тим не менш, він уже використовується як «стандарт» кількома інструментами. Це значно покращує сумісність, оскільки ви можете переключити Uvicorn на будь-який інший сервер ASGI (наприклад, Daphne або Hypercorn), або ви можете додати інструменти, сумісні з ASGI, як-от `python-socketio`.
|
||||
|
||||
!!! Перегляньте "**FastAPI** використовує його для"
|
||||
Керування всіма основними веб-частинами. Додавання функцій зверху.
|
||||
|
||||
Сам клас `FastAPI` безпосередньо успадковує клас `Starlette`.
|
||||
|
||||
Отже, усе, що ви можете робити зі Starlette, ви можете робити це безпосередньо за допомогою **FastAPI**, оскільки це, по суті, Starlette на стероїдах.
|
||||
|
||||
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>
|
||||
|
||||
Uvicorn — це блискавичний сервер ASGI, побудований на uvloop і httptools.
|
||||
|
||||
Це не веб-фреймворк, а сервер. Наприклад, він не надає інструментів для маршрутизації. Це те, що фреймворк на кшталт Starlette (або **FastAPI**) забезпечить поверх нього.
|
||||
|
||||
Це рекомендований сервер для Starlette і **FastAPI**.
|
||||
|
||||
!!! Перегляньте "**FastAPI** рекомендує це як"
|
||||
Основний веб-сервер для запуску програм **FastAPI**.
|
||||
|
||||
Ви можете поєднати його з Gunicorn, щоб мати асинхронний багатопроцесний сервер.
|
||||
|
||||
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}.
|
||||
|
||||
## Орієнтири та швидкість
|
||||
|
||||
Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}.
|
||||
Loading…
Reference in New Issue