fastapi/docs/uk/docs/index.md

31 KiB
Raw Blame History

FastAPI

FastAPI

Фреймворк FastAPI: висока продуктивність, легко вивчати, швидко писати код, готовий до продакшину

Test Coverage Package version Supported Python versions


Документація: https://fastapi.tiangolo.com

Вихідний код: https://github.com/fastapi/fastapi


FastAPI — це сучасний, швидкий (високопродуктивний) вебфреймворк для створення API за допомогою Python, що базується на стандартних підказках типів Python.

Ключові особливості:

  • Швидкий: дуже висока продуктивність, на рівні з NodeJS та Go (завдяки Starlette та Pydantic). Один із найшвидших Python-фреймворків.
  • Швидке написання коду: пришвидшує розробку функціоналу приблизно на 200%300%. *
  • Менше помилок: зменшує приблизно на 40% кількість помилок, спричинених людиною (розробником). *
  • Інтуїтивний: чудова підтримка редакторами коду. Автодоповнення всюди. Менше часу на налагодження.
  • Простий: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
  • Короткий: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
  • Надійний: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією.
  • Заснований на стандартах: базується на (і повністю сумісний з) відкритими стандартами для API: OpenAPI (раніше відомий як Swagger) та JSON Schema.

* оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки.

Спонсори

Ключовий спонсор

{% for sponsor in sponsors.keystone -%} {% endfor -%}

Золоті та срібні спонсори

{% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %}

Інші спонсори

Враження

"[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."

Kabir Khan - Microsoft (ref)

"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)

"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

"Im over the moon excited about FastAPI. Its so fun!"

Brian Okken - Python Bytes podcast host (ref)

"Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted Hug to be - it's really inspiring to see someone build that."

Timothy Crosley - Hug creator (ref)

"If you're looking to learn one modern framework for building REST APIs, check out FastAPI [...] It's fast, easy to use and easy to learn [...]"

"We've switched over to FastAPI for our APIs [...] I think you'll like it [...]"

Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)

"If anyone is looking to build a production Python API, I would highly recommend FastAPI. It is beautifully designed, simple to use and highly scalable, it has become a key component in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer."

Deon Pillsbury - Cisco (ref)

Міні-документальний фільм про FastAPI

Наприкінці 2025 року вийшов міні-документальний фільм про FastAPI, ви можете переглянути його онлайн:

FastAPI Mini Documentary

Typer, FastAPI для CLI

Якщо ви створюєте застосунок CLI для використання в терміналі замість веб-API, зверніть увагу на Typer.

Typer — молодший брат FastAPI. І його задумано як FastAPI для CLI. ⌨️ 🚀

Вимоги

FastAPI стоїть на плечах гігантів:

Встановлення

Створіть і активуйте віртуальне середовище, а потім встановіть FastAPI:

$ pip install "fastapi[standard]"

---> 100%

Примітка: переконайтеся, що ви взяли "fastapi[standard]" у лапки, щоб це працювало в усіх терміналах.

Приклад

Створіть

Створіть файл main.py з:

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
Або використайте async def...

Якщо ваш код використовує async / await, скористайтеся async def:

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

Примітка:

Якщо ви не знаєте, перегляньте розділ "In a hurry?" про async та await у документації.

Запустіть

Запустіть сервер за допомогою:

$ fastapi dev main.py

 ╭────────── FastAPI CLI - Development mode ───────────╮
 │                                                     │
 │  Serving at: http://127.0.0.1:8000                  │
 │                                                     │
 │  API docs: http://127.0.0.1:8000/docs               │
 │                                                     │
 │  Running in development mode, for production use:   │
 │                                                     │
 │  fastapi run                                        │
 │                                                     │
 ╰─────────────────────────────────────────────────────╯

INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2248755] using WatchFiles
INFO:     Started server process [2248757]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
Про команду fastapi dev main.py...

Команда fastapi dev читає ваш файл main.py, знаходить у ньому застосунок FastAPI і запускає сервер за допомогою Uvicorn.

За замовчуванням fastapi dev запускається з авто-перезавантаженням для локальної розробки.

Докладніше читайте в документації FastAPI CLI.

Перевірте

Відкрийте браузер і перейдіть на http://127.0.0.1:8000/items/5?q=somequery.

Ви побачите JSON-відповідь:

{"item_id": 5, "q": "somequery"}

Ви вже створили API, який:

  • Отримує HTTP-запити за шляхами / та /items/{item_id}.
  • Обидва шляхи приймають GET операції (також відомі як HTTP методи).
  • Шлях /items/{item_id} містить параметр шляху item_id, який має бути типу int.
  • Шлях /items/{item_id} містить необовʼязковий str параметр запиту q.

Інтерактивна документація API

Тепер перейдіть на http://127.0.0.1:8000/docs.

Ви побачите автоматичну інтерактивну документацію API (надану Swagger UI):

Swagger UI

Альтернативна документація API

А тепер перейдіть на http://127.0.0.1:8000/redoc.

Ви побачите альтернативну автоматичну документацію (надану ReDoc):

ReDoc

Приклад оновлення

Тепер змініть файл main.py, щоб отримувати тіло PUT-запиту.

Оголосіть тіло, використовуючи стандартні типи Python, завдяки Pydantic.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

Сервер fastapi dev має автоматично перезавантажитися.

Оновлення інтерактивної документації API

Тепер перейдіть на http://127.0.0.1:8000/docs.

  • Інтерактивна документація API буде автоматично оновлена, включно з новим тілом:

Swagger UI

  • Натисніть кнопку "Try it out", вона дозволяє заповнити параметри та безпосередньо взаємодіяти з API:

Swagger UI interaction

  • Потім натисніть кнопку "Execute", інтерфейс користувача зв'яжеться з вашим API, надішле параметри, отримає результати та покаже їх на екрані:

Swagger UI interaction

Оновлення альтернативної документації API

А тепер перейдіть на http://127.0.0.1:8000/redoc.

  • Альтернативна документація також відобразить новий параметр запиту та тіло:

ReDoc

Підсумки

Отже, ви оголошуєте один раз типи параметрів, тіла тощо як параметри функції.

Ви робите це за допомогою стандартних сучасних типів Python.

Вам не потрібно вивчати новий синтаксис, методи чи класи конкретної бібліотеки тощо.

Лише стандартний Python.

Наприклад, для int:

item_id: int

або для складнішої моделі Item:

item: Item

...і з цим єдиним оголошенням ви отримуєте:

  • Підтримку редактора, включно з:
    • Автодоповненням.
    • Перевіркою типів.
  • Валідацію даних:
    • Автоматичні та зрозумілі помилки, коли дані некоректні.
    • Валідацію навіть для глибоко вкладених JSON-обʼєктів.
  • Перетворення вхідних даних: з мережі до даних і типів Python. Читання з:
    • JSON.
    • Параметрів шляху.
    • Параметрів запиту.
    • Cookies.
    • Headers.
    • Forms.
    • Files.
  • Перетворення вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
    • Перетворення типів Python (str, int, float, bool, list, тощо).
    • Обʼєктів datetime.
    • Обʼєктів UUID.
    • Моделей бази даних.
    • ...та багато іншого.
  • Автоматичну інтерактивну документацію API, включно з 2 альтернативними інтерфейсами користувача:
    • Swagger UI.
    • ReDoc.

Повертаючись до попереднього прикладу коду, FastAPI:

  • Перевірить, що item_id є у шляху для GET та PUT-запитів.
  • Перевірить, що item_id має тип int для GET та PUT-запитів.
    • Якщо це не так, клієнт побачить корисну, зрозумілу помилку.
  • Перевірить, чи є необов'язковий параметр запиту з назвою q (як у http://127.0.0.1:8000/items/foo?q=somequery) для GET-запитів.
    • Оскільки параметр q оголошено як = None, він необов'язковий.
    • Без None він був би обов'язковим (як і тіло у випадку з PUT).
  • Для PUT-запитів до /items/{item_id} прочитає тіло як JSON:
    • Перевірить, що є обовʼязковий атрибут name, який має бути типу str.
    • Перевірить, що є обовʼязковий атрибут price, який має бути типу float.
    • Перевірить, що є необовʼязковий атрибут is_offer, який має бути типу bool, якщо він присутній.
    • Усе це також працюватиме для глибоко вкладених JSON-обʼєктів.
  • Автоматично перетворюватиме з та в JSON.
  • Документуватиме все за допомогою OpenAPI, який може бути використано в:
    • Інтерактивних системах документації.
    • Системах автоматичної генерації клієнтського коду для багатьох мов.
  • Надаватиме безпосередньо 2 вебінтерфейси інтерактивної документації.

Ми лише трішки доторкнулися до поверхні, але ви вже маєте уявлення про те, як усе працює.

Спробуйте змінити рядок:

    return {"item_name": item.name, "item_id": item_id}

...із:

        ... "item_name": item.name ...

...на:

        ... "item_price": item.price ...

...і побачите, як ваш редактор автоматично доповнюватиме атрибути та знатиме їхні типи:

editor support

Для більш повного прикладу, що включає більше можливостей, перегляньте Туторіал — Посібник користувача.

Spoiler alert: туторіал — посібник користувача містить:

  • Оголошення параметрів з інших різних місць, як-от: headers, cookies, form fields та files.
  • Як встановлювати обмеження валідації як maximum_length або regex.
  • Дуже потужну і просту у використанні систему Dependency Injection.
  • Безпеку та автентифікацію, включно з підтримкою OAuth2 з JWT tokens та HTTP Basic auth.
  • Досконаліші (але однаково прості) техніки для оголошення глибоко вкладених моделей JSON (завдяки Pydantic).
  • Інтеграцію GraphQL з Strawberry та іншими бібліотеками.
  • Багато додаткових можливостей (завдяки Starlette) як-от:
    • WebSockets
    • надзвичайно прості тести на основі HTTPX та pytest
    • CORS
    • Cookie Sessions
    • ...та більше.

Розгортання застосунку (необовʼязково)

За бажання ви можете розгорнути ваш застосунок FastAPI у FastAPI Cloud, перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀

Якщо у вас вже є обліковий запис FastAPI Cloud (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.

Перед розгортанням переконайтеся, що ви ввійшли в систему:

$ fastapi login

You are logged in to FastAPI Cloud 🚀

Потім розгорніть ваш застосунок:

$ fastapi deploy

Deploying to FastAPI Cloud...

✅ Deployment successful!

🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev

Ось і все! Тепер ви можете отримати доступ до вашого застосунку за цією URL-адресою.

Про FastAPI Cloud

FastAPI Cloud створено тим самим автором і командою, що стоять за FastAPI.

Він спрощує процес створення, розгортання та доступу до API з мінімальними зусиллями.

Він забезпечує той самий developer experience створення застосунків на FastAPI під час їх розгортання у хмарі. 🎉

FastAPI Cloud — основний спонсор і джерело фінансування open source проєктів FastAPI and friends.

Розгортання в інших хмарних провайдерів

FastAPI — open source і базується на стандартах. Ви можете розгортати застосунки FastAPI в будь-якому хмарному провайдері, який ви оберете.

Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути застосунки FastAPI у нього. 🤓

Продуктивність

Незалежні тести TechEmpower показують застосунки FastAPI, які працюють під керуванням Uvicorn, як одні з найшвидших доступних Python-фреймворків, поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*)

Щоб дізнатися більше, перегляньте розділ Benchmarks.

Залежності

FastAPI залежить від Pydantic і Starlette.

Залежності standard

Коли ви встановлюєте FastAPI за допомогою pip install "fastapi[standard]", ви отримуєте групу необовʼязкових залежностей standard:

Використовується Pydantic:

  • email-validator - для валідації електронної пошти.

Використовується Starlette:

  • httpx - потрібно, якщо ви хочете використовувати TestClient.
  • jinja2 - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
  • python-multipart - потрібно, якщо ви хочете підтримувати «parsing» форм за допомогою request.form().

Використовується FastAPI:

  • uvicorn - для сервера, який завантажує та обслуговує ваш застосунок. Це включає uvicorn[standard], до якого входять деякі залежності (наприклад, uvloop), потрібні для високопродуктивної роботи сервера.
  • fastapi-cli[standard] - щоб надати команду fastapi.
    • Це включає fastapi-cloud-cli, який дозволяє розгортати ваш застосунок FastAPI у FastAPI Cloud.

Без залежностей standard

Якщо ви не хочете включати необовʼязкові залежності standard, ви можете встановити через pip install fastapi замість pip install "fastapi[standard]".

Без fastapi-cloud-cli

Якщо ви хочете встановити FastAPI зі стандартними залежностями, але без fastapi-cloud-cli, ви можете встановити через pip install "fastapi[standard-no-fastapi-cloud-cli]".

Додаткові необовʼязкові залежності

Є ще деякі додаткові залежності, які ви можете захотіти встановити.

Додаткові необовʼязкові залежності Pydantic:

  • pydantic-settings - для керування налаштуваннями.
  • pydantic-extra-types - для додаткових типів, що можуть бути використані з Pydantic.

Додаткові необовʼязкові залежності FastAPI:

  • orjson - потрібно, якщо ви хочете використовувати ORJSONResponse.
  • ujson - потрібно, якщо ви хочете використовувати UJSONResponse.

Ліцензія

Цей проєкт ліцензовано згідно з умовами ліцензії MIT.