# Функціональні можливості ## Функціональні можливості FastAPI **FastAPI** надає вам такі можливості: ### Використання відкритих стандартів * OpenAPI для створення API, включаючи оголошення шляхів, операцій, параметрів, тіл запитів, безпеки тощо. * Автоматична документація моделей даних за допомогою JSON Schema (оскільки OpenAPI базується саме на JSON Schema). * Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури. * Це також дає змогу автоматично **генерувати код клієнта** багатьма мовами. ### Автоматична генерація документації Інтерактивна документація API та вебінтерфейс для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, два з яких включені за замовчуванням. * Swagger UI — дозволяє інтерактивно переглядати API, викликати та тестувати його прямо у браузері. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Альтернативна документація API за допомогою ReDoc. ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Тільки сучасний 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 однією з найпопулярніших функцій є "автодоповнення". **FastAPI** повністю підтримує автодоповнення у всіх місцях, тому вам рідко доведеться повертатися до документації. Приклад автодоповнення у редакторах: * у Visual Studio Code: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) * у PyCharm: ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) ### Короткий код 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% покриття тестами. * 100% анотована типами кодова база. * Використовується у робочих середовищах. ## Можливості Starlette **FastAPI** повністю сумісний із (та побудований на основі) Starlette. Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. **FastAPI** фактично є підкласом **Starlette**. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само. З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це, по суті, Starlette на стероїдах): * Разюча продуктивність. Це один із найшвидших фреймворків на Python, на рівні з **NodeJS** і **Go**. * Підтримка **WebSocket**. * Фонові задачі у процесі. * Події запуску та завершення роботи. * Клієнт для тестування, побудований на HTTPX. * Підтримка **CORS**, **GZip**, статичних файлів, потокових відповідей. * Підтримка **сесій** і **cookie**. * 100% покриття тестами. * 100% анотована типами кодова база. ## Можливості Pydantic **FastAPI** повністю сумісний із (та побудований на основі) Pydantic. Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. Включаючи зовнішні бібліотеки, побудовані також на Pydantic, такі як ORM, ODM для баз даних. Це також означає, що в багатьох випадках ви можете передати той самий об'єкт, який отримуєте з запиту, **безпосередньо в базу даних**, оскільки все автоматично перевіряється. Те ж саме відбувається й у зворотному напрямку — у багатьох випадках ви можете просто передати об'єкт, який отримуєте з бази даних, **безпосередньо клієнту**. З **FastAPI** ви отримуєте всі можливості **Pydantic** (адже FastAPI базується на Pydantic для обробки всіх даних): * **Ніякої плутанини** : * Не потрібно вчити нову мову для визначення схем. * Якщо ви знаєте типи Python, ви знаєте, як використовувати Pydantic. * Легко працює з вашим **IDE/лінтером/мозком**: * Оскільки структури даних Pydantic є просто екземплярами класів, які ви визначаєте; автодоповнення, лінтинг, mypy і ваша інтуїція повинні добре працювати з вашими перевіреними даними. * Валідація **складних структур**: * Використання ієрархічних моделей Pydantic. Python `typing`, `List` і `Dict` тощо. * Валідатори дозволяють чітко і просто визначати, перевіряти й документувати складні схеми даних у вигляді JSON-схеми. * Ви можете мати глибоко **вкладені JSON об'єкти** та перевірити та анотувати їх всі. * **Розширюваність**: * Pydantic дозволяє визначати користувацькі типи даних або розширювати валідацію методами в моделі декоратором `validator`. * 100% покриття тестами.