Що таке 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.138→0.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, з яких ви збиратимете решту свого стека.