committed by
GitHub
1 changed files with 189 additions and 0 deletions
@ -0,0 +1,189 @@ |
|||||
|
# Функціональні можливості |
||||
|
|
||||
|
## Функціональні можливості FastAPI |
||||
|
|
||||
|
**FastAPI** надає вам такі можливості: |
||||
|
|
||||
|
### Використання відкритих стандартів |
||||
|
|
||||
|
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> для створення API, включаючи оголошення <abbr title="також відомі як: endpoints, маршрути">шляхів</abbr>, <abbr title="також відомі як HTTP-методи, наприклад, POST, GET, PUT, DELETE">операцій</abbr>, параметрів, тіл запитів, безпеки тощо. |
||||
|
* Автоматична документація моделей даних за допомогою <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (оскільки OpenAPI базується саме на JSON Schema). |
||||
|
* Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури. |
||||
|
* Це також дає змогу автоматично **генерувати код клієнта** багатьма мовами. |
||||
|
|
||||
|
### Автоматична генерація документації |
||||
|
|
||||
|
Інтерактивна документація API та вебінтерфейс для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, два з яких включені за замовчуванням. |
||||
|
|
||||
|
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a> — дозволяє інтерактивно переглядати API, викликати та тестувати його прямо у браузері. |
||||
|
|
||||
|
 |
||||
|
|
||||
|
* Альтернативна документація API за допомогою <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>. |
||||
|
|
||||
|
 |
||||
|
|
||||
|
### Тільки сучасний Python |
||||
|
|
||||
|
FastAPI використовує стандартні **типи Python** (завдяки Pydantic). Вам не потрібно вивчати новий синтаксис — лише стандартний сучасний Python. |
||||
|
|
||||
|
Якщо вам потрібне коротке нагадування про використання типів у Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Вступ до типів Python](python-types.md){.internal-link target=_blank}. |
||||
|
|
||||
|
Ось приклад стандартного Python-коду з типами: |
||||
|
|
||||
|
```Python |
||||
|
from datetime import date |
||||
|
from pydantic import BaseModel |
||||
|
|
||||
|
# Оголошення змінної як str |
||||
|
# з підтримкою автодоповнення у редакторі |
||||
|
def main(user_id: str): |
||||
|
return user_id |
||||
|
|
||||
|
# Модель Pydantic |
||||
|
class User(BaseModel): |
||||
|
id: int |
||||
|
name: str |
||||
|
joined: date |
||||
|
``` |
||||
|
|
||||
|
Приклад використання цієї моделі: |
||||
|
|
||||
|
```Python |
||||
|
my_user: User = User(id=3, name="John Doe", joined="2018-07-19") |
||||
|
|
||||
|
second_user_data = { |
||||
|
"id": 4, |
||||
|
"name": "Mary", |
||||
|
"joined": "2018-11-30", |
||||
|
} |
||||
|
|
||||
|
my_second_user: User = User(**second_user_data) |
||||
|
``` |
||||
|
|
||||
|
/// info | Інформація |
||||
|
|
||||
|
`**second_user_data` означає: |
||||
|
|
||||
|
Передати ключі та значення словника `second_user_data` як аргументи у вигляді "ключ-значення", еквівалентно `User(id=4, name="Mary", joined="2018-11-30")`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
### Підтримка редакторів (IDE) |
||||
|
|
||||
|
Фреймворк спроєктований так, щоб бути легким і інтуїтивно зрозумілим. Усі рішення тестувалися у різних редакторах ще до початку розробки, щоб забезпечити найкращий досвід програмування. |
||||
|
|
||||
|
За результатами опитувань розробників Python <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">однією з найпопулярніших функцій є "автодоповнення"</a>. |
||||
|
|
||||
|
**FastAPI** повністю підтримує автодоповнення у всіх місцях, тому вам рідко доведеться повертатися до документації. |
||||
|
|
||||
|
Приклад автодоповнення у редакторах: |
||||
|
|
||||
|
* у <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>: |
||||
|
|
||||
|
 |
||||
|
|
||||
|
* у <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>: |
||||
|
|
||||
|
 |
||||
|
|
||||
|
### Короткий код |
||||
|
FastAPI має розумні налаштування **за замовчуванням**, але всі параметри можна налаштовувати відповідно до ваших потреб. Однак за замовчуванням все "просто працює". |
||||
|
|
||||
|
### Валідація |
||||
|
* Підтримка валідації для більшості (або всіх?) **типів даних Python**, зокрема: |
||||
|
* JSON-об'єктів (`dict`). |
||||
|
* JSON-списків (`list`) з визначенням типів елементів. |
||||
|
* Рядків (`str`) із мінімальною та максимальною довжиною. |
||||
|
* Чисел (`int`, `float`) з обмеженнями мінімальних та максимальних значень тощо. |
||||
|
|
||||
|
* Валідація складніших типів, таких як: |
||||
|
* URL. |
||||
|
* Email. |
||||
|
* UUID. |
||||
|
* ...та інші. |
||||
|
|
||||
|
Уся валідація виконується через надійний та перевірений **Pydantic**. |
||||
|
|
||||
|
### Безпека та автентифікація |
||||
|
|
||||
|
**FastAPI** підтримує вбудовану автентифікацію та авторизацію, без прив’язки до конкретних баз даних чи моделей даних. |
||||
|
|
||||
|
Підтримуються всі схеми безпеки OpenAPI, включаючи: |
||||
|
|
||||
|
* HTTP Basic. |
||||
|
* **OAuth2** (також із підтримкою **JWT-токенів**). Див. підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. |
||||
|
* Ключі API в: |
||||
|
* Заголовках. |
||||
|
* Параметрах запиту. |
||||
|
* Cookies тощо. |
||||
|
|
||||
|
А також усі можливості безпеки від Starlette (зокрема **сесійні cookies**). |
||||
|
|
||||
|
Усі вони створені як багаторазові інструменти та компоненти, які легко інтегруються з вашими системами, сховищами даних, реляційними та NoSQL базами даних тощо. |
||||
|
|
||||
|
### Впровадження залежностей |
||||
|
|
||||
|
**FastAPI** містить надзвичайно просту у використанні, але потужну систему впровадження залежностей. |
||||
|
|
||||
|
* Залежності можуть мати власні залежності, утворюючи ієрархію або **"граф залежностей"**. |
||||
|
* Усі залежності автоматично керуються фреймворком. |
||||
|
* Усі залежності можуть отримувати дані з запитів і розширювати **обмеження операції за шляхом** та автоматичну документацію. |
||||
|
* **Автоматична валідація** навіть для параметрів *операцій шляху*, визначених у залежностях. |
||||
|
* Підтримка складних систем автентифікації користувачів, **з'єднань із базами даних** тощо. |
||||
|
* **Жодних обмежень** щодо використання баз даних, фронтендів тощо, але водночас проста інтеграція з усіма ними. |
||||
|
|
||||
|
### Немає обмежень на "плагіни" |
||||
|
|
||||
|
Або іншими словами, вони не потрібні – просто імпортуйте та використовуйте необхідний код. |
||||
|
|
||||
|
Будь-яка інтеграція спроєктована настільки просто (з використанням залежностей), що ви можете створити "плагін" для свого застосунку всього у 2 рядках коду, використовуючи ту саму структуру та синтаксис, що й для ваших *операцій шляху*. |
||||
|
|
||||
|
### Протестовано |
||||
|
|
||||
|
* 100% <abbr title="Обсяг коду, що автоматично тестується">покриття тестами</abbr>. |
||||
|
* 100% <abbr title="Анотації типів у Python, завдяки яким ваш редактор і зовнішні інструменти можуть надавати кращу підтримку">анотована типами</abbr> кодова база. |
||||
|
* Використовується у робочих середовищах. |
||||
|
|
||||
|
## Можливості Starlette |
||||
|
|
||||
|
**FastAPI** повністю сумісний із (та побудований на основі) <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. |
||||
|
|
||||
|
**FastAPI** фактично є підкласом **Starlette**. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само. |
||||
|
|
||||
|
З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це, по суті, Starlette на стероїдах): |
||||
|
|
||||
|
* Разюча продуктивність. Це <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">один із найшвидших фреймворків на Python</a>, на рівні з **NodeJS** і **Go**. |
||||
|
* Підтримка **WebSocket**. |
||||
|
* Фонові задачі у процесі. |
||||
|
* Події запуску та завершення роботи. |
||||
|
* Клієнт для тестування, побудований на HTTPX. |
||||
|
* Підтримка **CORS**, **GZip**, статичних файлів, потокових відповідей. |
||||
|
* Підтримка **сесій** і **cookie**. |
||||
|
* 100% покриття тестами. |
||||
|
* 100% анотована типами кодова база. |
||||
|
|
||||
|
## Можливості Pydantic |
||||
|
|
||||
|
**FastAPI** повністю сумісний із (та побудований на основі) <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>. Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. |
||||
|
|
||||
|
Включаючи зовнішні бібліотеки, побудовані також на Pydantic, такі як <abbr title="Object-Relational Mapper">ORM</abbr>, <abbr title="Object-Document Mapper">ODM</abbr> для баз даних. |
||||
|
|
||||
|
Це також означає, що в багатьох випадках ви можете передати той самий об'єкт, який отримуєте з запиту, **безпосередньо в базу даних**, оскільки все автоматично перевіряється. |
||||
|
|
||||
|
Те ж саме відбувається й у зворотному напрямку — у багатьох випадках ви можете просто передати об'єкт, який отримуєте з бази даних, **безпосередньо клієнту**. |
||||
|
|
||||
|
З **FastAPI** ви отримуєте всі можливості **Pydantic** (адже FastAPI базується на Pydantic для обробки всіх даних): |
||||
|
|
||||
|
* **Ніякої плутанини** : |
||||
|
* Не потрібно вчити нову мову для визначення схем. |
||||
|
* Якщо ви знаєте типи Python, ви знаєте, як використовувати Pydantic. |
||||
|
* Легко працює з вашим **<abbr title="Інтегроване середовище розробки, схоже на редактор коду">IDE</abbr>/<abbr title="Програма, яка перевіряє помилки в коді">лінтером</abbr>/мозком**: |
||||
|
* Оскільки структури даних Pydantic є просто екземплярами класів, які ви визначаєте; автодоповнення, лінтинг, mypy і ваша інтуїція повинні добре працювати з вашими перевіреними даними. |
||||
|
* Валідація **складних структур**: |
||||
|
* Використання ієрархічних моделей Pydantic. Python `typing`, `List` і `Dict` тощо. |
||||
|
* Валідатори дозволяють чітко і просто визначати, перевіряти й документувати складні схеми даних у вигляді JSON-схеми. |
||||
|
* Ви можете мати глибоко **вкладені JSON об'єкти** та перевірити та анотувати їх всі. |
||||
|
* **Розширюваність**: |
||||
|
* Pydantic дозволяє визначати користувацькі типи даних або розширювати валідацію методами в моделі декоратором `validator`. |
||||
|
* 100% покриття тестами. |
Loading…
Reference in new issue