Первые шаги¶
Самый простой 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:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
<b>fastapi run</b>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> 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 "схема"¶
OpenAPI - это спецификация, которая определяет, как описывать схему API.
Определение схемы содержит пути (paths) API, их параметры и т.п.
"Схема" данных¶
Термин "схема" также может относиться к формату или структуре некоторых данных, например, JSON.
Тогда, подразумеваются атрибуты JSON, их типы данных и т.п.
OpenAPI и JSON Schema¶
OpenAPI описывает схему API. Эта схема содержит определения (или "схемы") данных, отправляемых и получаемых API. Для описания структуры данных в JSON используется стандарт JSON Schema.
Рассмотрим 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.
Шаг 3: определите операцию пути (path operation)¶
Путь (path)¶
"Путь" это часть URL, после первого символа /, следующего за именем домена.
Для URL:
https://example.com/items/foo
...путь выглядит так:
/items/foo
Дополнительная информация
Термин "path" также часто называется "endpoint" или "route".
При создании API, "путь" является основным способом разделения "задач" и "ресурсов".
Операция (operation)¶
"Операция" это один из "методов" HTTP.
Таких, как:
POSTGETPUTDELETE
...и более экзотических:
OPTIONSHEADPATCHTRACE
По протоколу 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 Info
Синтаксис @something в Python называется "декоратор".
Вы помещаете его над функцией. Как красивую декоративную шляпу (думаю, что оттуда и происходит этот термин).
"Декоратор" принимает функцию ниже и выполняет с ней какое-то действие.
В нашем случае, этот декоратор сообщает FastAPI, что функция ниже соответствует пути / и операции get.
Это и есть "декоратор операции пути".
Можно также использовать операции:
@app.post()@app.put()@app.delete()
И более экзотические:
@app.options()@app.head()@app.patch()@app.trace()
Подсказка
Вы можете использовать каждую операцию (HTTP-метод) по своему усмотрению.
FastAPI не навязывает определенного значения для каждого метода.
Информация здесь представлена как рекомендация, а не требование.
Например, при использовании GraphQL обычно все действия выполняются только с помощью POST операций.
Шаг 4: определите функцию операции пути¶
Вот "функция операции пути":
- путь:
/. - операция:
get. - функция: функция ниже "декоратора" (ниже
@app.get("/")).
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Это обычная Python функция.
FastAPI будет вызывать её каждый раз при получении GET запроса к URL "/".
В данном случае это асинхронная функция.
Вы также можете определить ее как обычную функцию вместо async def:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
Note
Если не знаете в чём разница, посмотрите Асинхронность: "Нет времени?".
Шаг 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.