Перейти до змісту

Що таке FastAPI

FastAPI — це вебфреймворк на Python для побудови API, створений Себастьяном Рамíресом і вперше випущений у грудні 2018 року. Це відкритий код під ліцензією MIT. Його головні переваги в тому, що ви описуєте свій API звичайними підказками типів Python, а натомість отримуєте автоматичну валідацію запитів, серіалізацію та інтерактивну документацію API — з продуктивністю на рівні Node.js і Go, бо він працює на ASGI (асинхронно), а не на WSGI (синхронно).

Якщо ви прийшли з Django, найважливіше, що треба зрозуміти від самого початку, ось що: FastAPI — не фреймворк розміру Django. Це тонкий, сфокусований шар, який займається маршрутизацією, валідацією та документацією, а все інше — базу даних, адмінку, шаблони, автентифікацію — залишає бібліотекам, які ви обираєте та з'єднуєте самотужки.

FastAPI — це стек, а не моноліт

Встановлення Django дає вам одну цілісну річ, що робить майже все. FastAPI навмисне маленький і стоїть на двох інших бібліотеках:

  • Starlette — ASGI-інструментарій під капотом. Він забезпечує власне обробку HTTP: маршрутизацію, запити й відповіді, middleware, фонові задачі, WebSockets і тестовий клієнт. FastAPI є застосунком Starlette із додатковими можливостями, що накладені зверху. Усе, що вміє Starlette, вміє й застосунок FastAPI.
  • Pydantic — валідація та серіалізація даних із підказок типів. Кожне тіло запиту, параметр запиту та форма відповіді — це модель Pydantic або тип, який Pydantic розуміє.

Сам FastAPI додає магію підказок типів, що зв'язує це докупи: він читає сигнатури ваших функцій, під'єднує валідацію через Pydantic і маршрутизацію через Starlette і генерує схему OpenAPI безкоштовно.

Щоб насправді обслуговувати запити, вам також потрібен ASGI-сервер — найчастіше Uvicorn. Це відповідник WSGI-сервера (Gunicorn/uWSGI), за яким ви вже запускаєте Django у продакшені, тільки він говорить асинхронним протоколом ASGI.

З досвіду Django: Django — «з батарейками в комплекті» — ORM, міграції, адмінка, автентифікація, форми, шаблони, сесії та WSGI-handler постачаються в одному пакеті з одним циклом релізів. FastAPI — протилежність: він володіє маршрутизацією + валідацією + документацією, а для всього іншого ви збираєте стек. Немає жодного django-admin startproject, який розкладе модуль налаштувань, URL-conf і точку входу WSGI. Ви починаєте з порожнього файлу.

Що постачається, а що приносите ви самі

Задача Django FastAPI
Маршрутизація URL urls.py + path() декоратори на функціях (@app.get(...))
Валідація запиту Форми / серіалізатори DRF моделі Pydantic (вбудовано)
Серіалізація серіалізатори DRF / шаблони Pydantic + response_model (вбудовано)
Інтерактивна документація API Browsable API DRF / доповнення Swagger UI + ReDoc (вбудовано)
ORM Django ORM (вбудовано) немає — беріть SQLAlchemy, SQLModel, Tortoise, …
Міграції міграції Django (вбудовано) немає — беріть Alembic (або інструмент вашого ORM)
Адмінка django.contrib.admin (вбудовано) немає — беріть SQLAdmin, Piccolo або будуйте свою
Автентифікація / сесії django.contrib.auth (вбудовано) немає — беріть помічники OAuth2/JWT, Depends
Шаблони Django Template Language (вбудовано) немає вбудованих — Starlette + Jinja2
Налаштування модуль settings.py немає — беріть pydantic-settings
Сервер WSGI (ASGI опційно) ASGI (Uvicorn)

Порожні клітинки на боці FastAPI — це і є вся причина, чому в цій книзі є тема «Від батарейок Django до стека FastAPI» ближче до кінця: перехід на FastAPI — це почасти вивчення фреймворку, а почасти вивчення того, яка бібліотека замінює кожну батарейку Django, яку ви сприймали як належне.

Ідея підказок типів у 10 рядках

Ось повний застосунок FastAPI. Він валідує вхідні дані, серіалізує вихідні й документує сам себе — усе з підказок типів.

from fastapi import FastAPI

app = FastAPI()


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

З цих підказок FastAPI робить висновок, що:

  • item_id надходить зі шляху й має бути int/items/abc повертає помилку валідації 422, а не падає.
  • q — необов'язковий рядок запиту — /items/5?q=hello працює, так само й /items/5.
  • повернутий dict серіалізується у JSON.

Запустіть це через Uvicorn і відкрийте /docs:

pip install "fastapi[standard]==0.139.2" "uvicorn==0.34.0"
uvicorn main:app --reload
# open http://127.0.0.1:8000/docs

Ви отримаєте живий Swagger UI, де можна викликати ендпоінт, плюс другий UI документації на /redoc — обидва згенеровані з тієї самої схеми OpenAPI.

З досвіду Django: Найближчий аналог зі світу Django — це Django REST Framework, де ви оголошуєте Serializer і отримуєте валідацію плюс Browsable API. FastAPI згортає це в саму сигнатуру функції — параметр і є схемою. І там, де генерація схеми/OpenAPI в DRF — це доповнення, яке ви налаштовуєте, у FastAPI документ OpenAPI та два UI документації увімкнені за замовчуванням від першого рядка.

ASGI проти WSGI: чому «асинхронність» — це заголовок

WSGI — протокол, на якому побудовано Django — синхронний: один запит займає один робочий потік/процес, доки не завершиться. ASGI — асинхронний наступник. Він дозволяє одному воркеру обробляти багато запитів одночасно, призупиняючи їх у точках await (очікування бази даних, HTTP-виклику, черги) замість того, щоб блокувати цілий потік.

FastAPI — ASGI-нативний. Ви пишете операції шляху як def (звичайні, виконуються в пулі потоків) або async def (виконуються в циклі подій), і змішувати їх можна вільно:

@app.get("/sync")
def sync_view():
    return {"style": "sync"}


@app.get("/async")
async def async_view():
    return {"style": "async"}

З досвіду Django: Django — WSGI-first, але вже кілька версій підтримує ASGI та async def в'ю, тож асинхронність не є унікальною для FastAPI. Практична різниця — у замовчуванні та глибині: FastAPI асинхронний до самого низу (Starlette, тестовий клієнт, залежності, middleware), тоді як у Django великі частини стека — насамперед значна частина ORM — усе ще синхронні, тож async def в'ю часто зрештою викликає sync_to_async навколо блокувальних шматків. Цій темі ми присвятимо цілий розділ згодом.

Супровід, версіонування та стабільність

  • Розробляється відкрито на github.com/fastapi/fastapi.
  • Ліцензія MIT; підтримується переважно Себастьяном Рамíресом і командою супроводжувачів, фінансується через спонсорство.
  • До 1.0. FastAPI версіонується як 0.x. На практиці він широко використовується в продакшені й доволі стабільний, але поки що не дотримується семантичного версіонування: підняття мінорної версії (наприклад, 0.1380.139) може містити ламку зміну. Фіксуйте точну версію (fastapi==0.139.2) і читайте нотатки до релізу перед оновленням.

З досвіду Django: Це справжня зміна культури. Гарантії сумісності Django та LTS-гілки означають, що на версію можна спиратися роками. FastAPI рухається швидше й просить вас фіксувати версії та стежити за ними активніше — а що ваш стек складається з кількох незалежно версіонованих бібліотек (FastAPI, Starlette, Pydantic, Uvicorn, ваш ORM), «версія фреймворку» — це насправді набір версій, якими ви керуєте разом.

Спільнота та ресурси

  • fastapi.tiangolo.com — офіційна документація; туторіал чудовий і водночас слугує довідником.
  • docs.pydantic.dev та starlette.io — ви читатимете їх напряму, бо FastAPI передає справжню роботу обом.
  • FastAPI GitHub Discussions, сабреддит r/FastAPI і великі спільноти Pydantic/SQLAlchemy, з яких ви збиратимете решту свого стека.

Джерела