FastAPI это современный, быстрый фреймворк web для построения API на стандартных типах Python.
Ключевые фичи FastAPI:
● Fast: очень высокая производительность на основе NodeJS и Go. Один из самых быстрых доступных фреймворков Python. ● Скорость разработки повышается на 200% .. 300%(*). ● Меньше багов: уменьшение примерно на 40% человеческих ошибок разработчика(*). ● Интуитивно-понятен: отличная поддержка редактора, везде есть завершение операторов. Меньше тратится времени на отладку. ● Простота: разработано с акцентом легкости использования и обучения. Меньше тратится времени на чтение документации. ● Краткость: минимизируется дублирование кода. Несколько фич для декларации каждого параметра. Меньше ошибок. ● Надежность: получение готового к использованию кода. Автоматическая генерация интерактивной документации. ● Основно на стандартах: базируется на (с обеспечением полной совместимости) на открытых стандартах для API: OpenAPI (ранее известного как Swagger) и JSON Schema.
Примечание (*): оценка основана на внутренних тестах команды разработчиков, сборке рабочих приложений.
[Typer, FastAPI для CLI]
Если вы разрабатываете CLI-приложение в терминале вместо web API, рассмотрите Typer [2]. Typer - младший брат FastAPI. И это должен быть FastAPI интерфейса командной строки.
FastAPI стоит на плечах гигантов:
Starlette [3] для частей web. Pydantic [4] для частей данных.
[Установка FastAPI]
Создайте и активируйте виртуальное окружение (например на основе pyenv), и затем установите FastAPI (убедитесь, что заключили "fastapi[standard]" в кавычки, чтобы это работало во всех терминалах):
Примечание: если вы не понимаете, что такое async/await, то см. [5].
Запустите этот скрипт командой:
$ fastapi dev main.py
Команда fastapi dev прочитает файл main.py, обнаружит в нем приложение FastAPI и запустит сервер, используя Uvicorn. По умолчанию fastapi dev запустится с разрешенной фичей auto-reload для локальной разработки. Подробнее об этом можно прочитать в документации FastAPI CLI [6].
Для проверки работы этого сервера откройте в браузере ссылку 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.
Апгрейд: добавление обработки запроса PUT. Давайте теперь изменим файл main.py, чтобы сервер принимал запрос PUT. Тело запроса декларируется с помощью стандартных типов Python, благодаря классу Pydantic.
Проверим работу запроса PUT с помощью сервиса интерактивной документации, по ссылке http://127.0.0.1:8000/docs#/:
Разверните выпадающий список PUT, нажмите на кнопку "Try it out", это позволит заполнить поля запроса item_id и отредактировать текст тела запроса "Request body".
После этого нажмите на кнопку Execute. В логе сервера вы увидите сообщения "PUT /items/1234 HTTP/1.1" 200:
INFO Will watch for changes in these directories: ['/home/appFastAPI']
INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO Started reloader process [57266] using WatchFiles
INFO Started server process [57320]
INFO Waiting for application startup.
INFO Application startup complete.
INFO 127.0.0.1:48966 - "GET /docs HTTP/1.1" 200
INFO 127.0.0.1:48966 - "GET /openapi.json HTTP/1.1" 200
INFO 127.0.0.1:54810 - "PUT /items/1234 HTTP/1.1" 200
INFO 127.0.0.1:43518 - "PUT /items/1234 HTTP/1.1" 200
INFO 127.0.0.1:43518 - "PUT /items/1234 HTTP/1.1" 200
Резюме. В общем, вы декларируете однократно типы параметров, тело и прочее как параметры функции. Это делается с помощью стандартных современных типов Python. Вам не нужно изучать новый синтаксис, методы или классы конкретной библиотеки и т. д. Это просто стандартный Python.
2. Проверку допустимости данных: ● Автоматические и понятные ошибки, когда данные недопустимые. ● Проверка срабатывает даже для глубоко вложенных объектов JSON.
3. Преобразование входных данных: данные, поступающие по сети, преобразуются в данные и типы Python. Поддерживается чтение из: ● JSON. ● Параметров пути (Path). ● Параметров запроса (Query). ● Cookies. ● Headers. ● Forms. ● Files.
4. Преобразование выходных данных: из данных и типов Python в сетевые данные (в виде JSON): ● Преобразование типов Python (str, int, float, bool, list, etc). ● Объекты datetime. ● Объекты UUID. ● Модели базы данных. ● ... и многое другое.
5. Автоматическая интерактивная документация для вашего созданного API, включая 2 альтернативных пользовательских интерфейса: ● Swagger UI. ● ReDoc.
Если вернуться к последнему примеру кода, то FastAPI будет делать следующее:
1. Проверит наличие item_id в пути для запросов GET и PUT.
2. Проверит, что у item_id тип int для запросов GET и PUT.
- Если это не так, то клиент увидит понятное сообщение об ошибке.
3. Проверит наличие опционального параметра запроса с именем q (как в http://127.0.0.1:8000/items/foo?q=somequery) для запросов GET.
- Поскольку параметр q декларирован с = None, то он опциональный (его наличие необязательно). - Без None он становится требуемым (поскольку это тело запроса в случае PUT).
4. Для запросов PUT /items/{item_id} тело считывается как JSON:
- Проверяется, что требуемый атрибут name имеет тип str. - Проверяется, что требуемый атрибут price имеет тип float. - Проверяется, есть ли опциональный атрибут is_offer, который, если он присутствует, должен иметь тип bool. - Все это будет также работать и для вложенных объектов JSON.
5. Автоматическое преобразование в JSON и обратно.
6. Все документируется с OpenAPI, что может использоваться:
- Интерактивными системами документации. - Автоматическими системами генерации кода клиента для многих языков.
7. Напрямую предоставляются 2 вида интерактивной web-документации.