Browse Source
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>pull/10204/head
committed by
GitHub
1 changed files with 412 additions and 0 deletions
@ -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