FastAPI
FastAPI фреймворк, высокая производительность, простота обучения, быстрая разработка, готов к использованию в производстве
Документация: https://fastapi.tiangolo.com
Исходный код: https://github.com/fastapi/fastapi
FastAPI — это современный, быстрый (высокой производительности) фреймворк для веб-API на Python, основанный на стандартных подсказках типов Python.
Ключевые особенности:
- Быстрый: Очень высокая производительность, сопоставимая с NodeJS и Go (благодаря Starlette и Pydantic). Один из самых быстрых фреймворков Python, доступных на рынке.
- Быстрая разработка: Увеличьте скорость разработки функций примерно на 200–300%. *
- Меньше ошибок: Снизьте количество ошибок, допущенных разработчиком, примерно на 40%. *
- Интуитивный: Отличная поддержка редакторов. Автодополнение (также известное как автозаполнение, IntelliSense) везде. Меньше времени, затрачиваемого на отладку.
- Легкий: Разработан для простоты использования и обучения. Меньше времени, затрачиваемого на чтение документации.
- Краткость: Минимизируйте дублирование кода. Несколько функций из каждого объявления параметров. Меньше ошибок.
- Надежный: Получите код, готовый к использованию в производстве. С автоматической интерактивной документацией.
- Основанный на стандартах: Основан на (и полностью совместим с) открытыми стандартами для API: OpenAPI (ранее известный как Swagger) и JSON Schema.
* оценка основана на тестах внутренней команды разработчиков при создании приложений для производства.
Мнения
Typer, FastAPI для командной строки
Требования
Установка
$ pip install "fastapi[standard]"
---> 100%
Пример
Создайте его
- Создайте файл
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}
Примечание:
Если вы не знаете, ознакомьтесь с разделом «В спешке?» о 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.
Проверьте его
{"item_id": 5, "q": "somequery"}
- Получает HTTP-запросы по путям
/и/items/{item_id}. - Оба пути принимают
GETоперации (также известные как HTTP-методы). - Путь
/items/{item_id}имеет параметр путиitem_id, который должен бытьint. - Путь
/items/{item_id}имеет необязательный параметр запросаstrq.
Интерактивная документация API
Альтернативная документация API
Пример обновления
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}
Обновление интерактивной документации API
- Интерактивная документация API будет автоматически обновлена, включая новый запрос:
- Нажав кнопку «Попробовать», можно заполнить параметры и напрямую взаимодействовать с API:
- Затем нажав кнопку «Выполнить», пользовательский интерфейс свяжется с вашим API, отправит параметры, получит результаты и отобразит их на экране:
Обновление альтернативной документации API
- Альтернативная документация также будет отражать новый параметр запроса и тело:
Итог
item_id: int
item: Item
- Поддержка редакторов, включая:
- Автодополнение.
- Проверку типов.
- Валидация данных:
- Автоматическое и ясное отображение ошибок при неверных данных.
- Валидация даже для глубоко вложенных JSON-объектов.
-
Преобразование входных данных (также известное как сериализация, парсинг, маршаллинг): преобразование данных из сети в данные и типы Python. Чтение из:
- JSON.
- Параметров пути.
- Параметров запроса.
- Куки.
- Заголовков.
- Формы.
- Файлов.
-
Преобразование выходных данных (также известное как сериализация, парсинг, маршаллинг): преобразование данных из Python-данных и типов в сетевые данные (в формате JSON):
- Преобразование Python-типов (
str,int,float,bool,list, и т. д.). -
Объекты
datetime. -
Объекты
UUID. - Модели баз данных.
- …и многое другое.
- Преобразование Python-типов (
- Автоматическая интерактивная документация API, включая 2 альтернативных пользовательских интерфейса:
- Swagger UI.
- ReDoc.
- Проверьте, что в пути присутствует
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 и в JSON.
- Документируйте всё с помощью OpenAPI, которое может использоваться:
- Системой интерактивной документации.
- Системой автоматической генерации кода клиентов для многих языков.
- Предоставьте 2 интерактивных веб-интерфейса документации напрямую.
return {"item_name": item.name, "item_id": item_id}
... "item_name": item.name ...
... "item_price": item.price ...
- Объявление параметров из разных источников, таких как: заголовки, куки, поля формы и файлы.
- Как настроить ограничения валидации как
maximum_lengthилиregex. - Очень мощная и простая в использовании система инъекции зависимостей.
- Безопасность и аутентификация, включая поддержку OAuth2 с JWT-токенами и аутентификацией HTTP Basic.
- Более продвинутые (но такие же простые) методы объявления вложенных JSON-моделей (благодаря Pydantic).
- Интеграция с GraphQL с помощью Strawberry и других библиотек.
- Многие дополнительные функции (благодаря Starlette):
- WebSockets
- очень простые тесты на основе HTTPX и
pytest - CORS
- Сессии Cookie
- …и многое другое.
Производительность
Зависимости
standard Зависимости
-
email-validator- для валидации адресов электронной почты.
-
httpx- Необходима, если вы хотите использоватьTestClient. -
jinja2- Необходима, если вы хотите использовать конфигурацию шаблонов по умолчанию. -
python-multipart- Необходима, если вы хотите поддерживать разбор форм, сrequest.form().
-
uvicorn- для сервера, который загружает и обслуживает ваше приложение. Это включаетuvicorn[standard], что включает некоторые зависимости (например,uvloop) необходимые для высокопроизводительного обслуживания. -
fastapi-cli- для предоставления командыfastapi.
Без standard зависимостей
Дополнительные необязательные зависимости
-
pydantic-settings- для управления настройками. -
pydantic-extra-types- для дополнительных типов, которые можно использовать с Pydantic.
-
orjson- Необходима, если вы хотите использоватьORJSONResponse. -
ujson- Необходима, если вы хотите использоватьUJSONResponse.
Лицензия
© 2018 Sebastián Ramírez
Licensed under the MIT License.
https://fastapi.tiangolo.com/