Перші кроки¶
Найпростіший файл FastAPI може виглядати так:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Скопіюйте це до файлу main.py
.
Запустіть сервер:
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO </font> Using path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
<font color="#3465A4">INFO </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮
│ │
│ 🐍 main.py │
│ │
╰──────────────────────╯
<font color="#3465A4">INFO </font> Importing module <font color="#4E9A06">main</font>
<font color="#3465A4">INFO </font> Found importable FastAPI app
╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮
│ │
│ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> │
│ │
╰──────────────────────────╯
<font color="#3465A4">INFO </font> Using import string <font color="#8AE234"><b>main:app</b></font>
<span style="background-color:#C4A000"><font color="#2E3436">╭────────── FastAPI CLI - Development mode ───────────╮</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ Serving at: http://127.0.0.1:8000 │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ API docs: http://127.0.0.1:8000/docs │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ Running in development mode, for production use: │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ </font></span><span style="background-color:#C4A000"><font color="#555753"><b>fastapi run</b></font></span><span style="background-color:#C4A000"><font color="#2E3436"> │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">│ │</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">╰─────────────────────────────────────────────────────╯</font></span>
<font color="#4E9A06">INFO</font>: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
<font color="#4E9A06">INFO</font>: Uvicorn running on <b>http://127.0.0.1:8000</b> (Press CTRL+C to quit)
<font color="#4E9A06">INFO</font>: Started reloader process [<font color="#34E2E2"><b>2265862</b></font>] using <font color="#34E2E2"><b>WatchFiles</b></font>
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">2265873</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
У консолі буде рядок приблизно такого змісту:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Цей рядок показує URL, за яким додаток запускається на вашій локальній машині.
Перевірте¶
Відкрийте браузер та введіть адресу http://127.0.0.1:8000.
Ви побачите у відповідь таке повідомлення у форматі JSON:
{"message": "Hello World"}
Інтерактивна API документація¶
Перейдемо сюди http://127.0.0.1:8000/docs.
Ви побачите автоматичну інтерактивну API документацію (створену завдяки Swagger UI):
Альтернативна API документація¶
Тепер перейдемо сюди http://127.0.0.1:8000/redoc.
Ви побачите альтернативну автоматичну документацію (створену завдяки ReDoc):
OpenAPI¶
FastAPI генерує "схему" з усім вашим API, використовуючи стандарт OpenAPI для визначення API.
"Схема"¶
"Схема" - це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис.
API "схема"¶
У цьому випадку, OpenAPI є специфікацією, яка визначає, як описати схему вашого API.
Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають тощо.
"Схема" даних¶
Термін "схема" також може відноситися до структури даних, наприклад, JSON.
У цьому випадку це означає - атрибути JSON і типи даних, які вони мають тощо.
OpenAPI і JSON Schema¶
OpenAPI описує схему для вашого API. І ця схема включає визначення (або "схеми") даних, що надсилаються та отримуються вашим API за допомогою JSON Schema, стандарту для схем даних JSON.
Розглянемо openapi.json
¶
Якщо вас цікавить, як виглядає вихідна схема OpenAPI, то FastAPI автоматично генерує JSON-схему з усіма описами API.
Ознайомитися можна за посиланням: http://127.0.0.1:8000/openapi.json.
Ви побачите приблизно такий JSON:
{
"openapi": "3.1.0",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"paths": {
"/items/": {
"get": {
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
...
Для чого потрібний OpenAPI¶
Схема OpenAPI є основою для обох систем інтерактивної документації.
Існують десятки альтернативних інструментів, заснованих на OpenAPI. Ви можете легко додати будь-який з них до FastAPI додатку.
Ви також можете використовувати OpenAPI для автоматичної генерації коду для клієнтів, які взаємодіють з API. Наприклад, для фронтенд-, мобільних або IoT-додатків
А тепер крок за кроком¶
Крок 1: імпортуємо FastAPI
¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
FastAPI
це клас у Python, який надає всю функціональність для API.
Технічні деталі
FastAPI
це клас, який успадковується безпосередньо від Starlette
.
Ви також можете використовувати всю функціональність Starlette у FastAPI
.
Крок 2: створюємо екземпляр FastAPI
¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Змінна app
є екземпляром класу FastAPI
.
Це буде головна точка для створення і взаємодії з API.
Крок 3: визначте операцію шляху (path operation)¶
Шлях (path)¶
"Шлях" це частина URL, яка йде одразу після символу /
.
Отже, у такому URL, як:
https://example.com/items/foo
...шлях буде:
/items/foo
Додаткова інформація
"Шлях" (path) також зазвичай називають "ендпоінтом" (endpoint) або "маршрутом" (route).
При створенні API, "шлях" є основним способом розділення "завдань" і "ресурсів".
Operation¶
"Операція" (operation) тут означає один з "методів" HTTP.
Один з:
POST
GET
PUT
DELETE
...та більш екзотичних:
OPTIONS
HEAD
PATCH
TRACE
У HTTP-протоколі можна спілкуватися з кожним шляхом, використовуючи один (або кілька) з цих "методів".
При створенні API зазвичай використовуються конкретні методи HTTP для виконання певних дій.
Як правило, використовують:
POST
: для створення даних.GET
: для читання даних.PUT
: для оновлення даних.DELETE
: для видалення даних.
В OpenAPI кожен HTTP метод називається "операція".
Ми також будемо дотримуватися цього терміна.
Визначте декоратор операції шляху (path operation decorator)¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Декоратор @app.get("/")
вказує FastAPI, що функція нижче, відповідає за обробку запитів, які надходять до неї:
- шлях
/
- використовуючи
get
операцію
@decorator
Додаткова інформація
Синтаксис @something
у Python називається "декоратором".
Ви розташовуєте його над функцією. Як гарний декоративний капелюх (мабуть, звідти походить термін).
"Декоратор" приймає функцію нижче і виконує з нею якусь дію.
У нашому випадку, цей декоратор повідомляє FastAPI, що функція нижче відповідає шляху /
і операції get
.
Це і є "декоратор операції шляху (path operation decorator)".
Можна також використовувати операції:
@app.post()
@app.put()
@app.delete()
І більш екзотичні:
@app.options()
@app.head()
@app.patch()
@app.trace()
Порада
Ви можете використовувати кожну операцію (HTTP-метод) на свій розсуд.
FastAPI не нав'язує жодного певного значення для кожного методу.
Наведена тут інформація є рекомендацією, а не обов'язковою вимогою.
Наприклад, під час використання GraphQL зазвичай усі дії виконуються тільки за допомогою POST
операцій.
Крок 4: визначте функцію операції шляху (path operation function)¶
Ось "функція операції шляху":
- шлях: це
/
. - операція: це
get
. - функція: це функція, яка знаходиться нижче "декоратора" (нижче
@app.get("/")
).
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Це звичайна функція Python.
FastAPI викликатиме її щоразу, коли отримає запит до URL із шляхом "/", використовуючи операцію GET
.
У даному випадку це асинхронна функція.
Ви також можете визначити її як звичайну функцію замість async def
:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
Примітка
Якщо не знаєте в чому різниця, подивіться Конкурентність: "Поспішаєш?".
Крок 5: поверніть результат¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Ви можете повернути dict
, list
, а також окремі значення str
, int
, ітд.
Також можна повернути моделі Pydantic (про це ви дізнаєтесь пізніше).
Існує багато інших об'єктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені, велика ймовірність, що вони вже підтримуються.
Підіб'ємо підсумки¶
- Імпортуємо
FastAPI
. - Створюємо екземпляр
app
. - Пишемо декоратор операції шляху як
@app.get("/")
. - Пишемо функцію операції шляху; наприклад,
def root(): ...
. - Запускаємо сервер у режимі розробки
fastapi dev
.