31 KiB
FastAPI
Фреймворк FastAPI: висока продуктивність, легко вивчати, швидко писати код, готовий до продакшину
Документація: 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."
"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"
"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"
"I’m over the moon excited about FastAPI. It’s so fun!"
"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."
"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 [...]"
"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."
Міні-документальний фільм про FastAPI
Наприкінці 2025 року вийшов міні-документальний фільм про FastAPI, ви можете переглянути його онлайн:
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):
Альтернативна документація API
А тепер перейдіть на http://127.0.0.1:8000/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 буде автоматично оновлена, включно з новим тілом:
- Натисніть кнопку "Try it out", вона дозволяє заповнити параметри та безпосередньо взаємодіяти з API:
- Потім натисніть кнопку "Execute", інтерфейс користувача зв'яжеться з вашим API, надішле параметри, отримає результати та покаже їх на екрані:
Оновлення альтернативної документації API
А тепер перейдіть на http://127.0.0.1:8000/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. - Моделей бази даних.
- ...та багато іншого.
- Перетворення типів Python (
- Автоматичну інтерактивну документацію 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 ...
...і побачите, як ваш редактор автоматично доповнюватиме атрибути та знатиме їхні типи:
Для більш повного прикладу, що включає більше можливостей, перегляньте Туторіал — Посібник користувача.
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.








