Установка приложений, маршрутизаторы API, шаблоны Jinja и многое другое

Введение

FastAPI — это современная веб-инфраструктура, разработанная на Python. В последнее время он приобрел большую привлекательность. Его структура разработки очень похожа на Flask, который де-факто был вариантом для всех, кто начинал с веб-разработки с использованием Python. FastAPI прост в использовании, его документация хорошо написана и проста в использовании.

FastAPI предлагает все стандартные функции инструмента для создания API, но не ограничивается этим. Он обладает большой гибкостью, такой как поддержка обратного монтирования WSGI, о которой большинство пользователей не знают.

В этой статье я расскажу о некоторых расширенных функциях FastAPI, которые я использовал в своих последних проектах. Кроме того, следующие варианты использования предполагают, что у вас есть базовые знания FastAPI.

1. Включите Flask, Django, Dash или любой другой WSGI.

FastAPI — это веб-фреймворк ASGI. Это означает, что разные запросы не должны ждать, пока другие закончат выполнение своих задач. Различные запросы могут выполнять свою задачу в произвольном порядке. С другой стороны, фреймворки WSGI обрабатывают запрос последовательно.

FastAPI позволяет монтировать приложения WSGI любого типа, такие как Flask, внутри приложения FastAPI. Это означает, что на корневом уровне у вас может быть основное приложение FastAPI и, кроме того, для разных маршрутов у вас могут быть приложения WSGI, такие как Flask, которые будут обрабатывать все запросы для этого конкретного пути.

Одним из вариантов использования этого, который я использовал для своего проекта, является монтирование plotly-dash в качестве промежуточного программного обеспечения WSGI. Я смонтировал сервер dash для маршрута панели инструментов моего веб-сайта, который отделяет логику панели инструментов от основного приложения FastAPI. Это также обеспечивает гибкость отключения панели мониторинга в любое время, когда нагрузка на сервер возрастает. Вот абстрактная реализация монтирования промежуточного ПО WSGI, которое я сделал для одного из проектов.

Ниже приведен пример содержимого файла dashboard.py:

Чтобы включить этот сервер dash в качестве независимого приложения в FastAPI, просто оберните объект приложения WSGI в класс WSGIMiddleware и передайте этот обернутый объект в качестве параметра в функции монтирования корневого объекта FastAPI. Функция монтирования также принимает путь, по которому следует использовать это приложение. Например, эта информационная панель будет смонтирована по пути «/dashboard». См. содержимое файла main.py ниже:

Если кто-либо посетит маршрут панели управления, все эти запросы будут временно перенаправлены на сервер dash.

Ссылка на мой проект, который поддерживается FastAPI и использует все концепции, описанные в этой статье: https://ipuresultskg.herokuapp.com/. Это портал результатов, который я разработал для своего университета. Используйте мой регистрационный номер, чтобы познакомиться с веб-сайтом: 43114803118 (пакет 2018 г.)

2. Смонтируйте разные приложения FastAPI для разных маршрутов

Следуя тем же правилам монтирования разных приложений WSGI для разных маршрутов, вы также можете монтировать разные приложения FastAPI внутри приложения FastAPI. Это будет означать, что каждое суб-FastAPI-приложение будет иметь свою документацию, будет работать независимо от других приложений и будет обрабатывать свои запросы, зависящие от пути. Чтобы смонтировать это, просто создайте главное приложение и файл подприложения. Теперь импортируйте объект приложения из файла подприложения в файл главного приложения и передайте этот объект непосредственно в функцию монтирования объекта главного приложения. Этот обходной путь не требует промежуточного программного обеспечения. См. пример ниже:

Ниже приведено содержимое файла apiv1.py (подприложение 1):

А вот код файла apiv2.py (подприложение 2):

Теперь мы можем смонтировать оба этих подприложения в главном приложении. См. код файла master.py:

Если вы делаете запросы к конечным точкам соответствующих путей, запрос будет обрабатываться этими подприложениями.

3. Разделите ваши маршруты FastAPI на разные файлы

Обычно случается так, что по мере того, как ваше приложение становится больше, управление всеми маршрутами в одном месте становится беспорядочным. Иногда могут происходить перекрытия или вы можете дублировать маршрут, не зная о последствиях позже. Что, если бы существовала система, в которой вы могли бы группировать маршруты в разные файловые структуры и легко ими управлять?

FastAPI имеет систему APIRouters. Их можно рассматривать как мини-приложения FastAPI, которые являются частью более крупного приложения. Это означает, что можно разбить большие маршруты приложений на небольшие блоки APIRouters и смонтировать отдельные APIRouters в основном приложении.

Обратите внимание, что эти APIRouters являются частью более крупного приложения, а не независимыми приложениями, подобными тем, которые мы видели в двух предыдущих разделах. Поэтому все маршруты от всех APIRouters будут перечислены в основной документации приложения.

Эти APIRouters могут иметь отдельные префиксы для операций пути, тегов, зависимостей и ответов. Поэтому, чтобы реализовать это, вам нужно импортировать класс APIRouter из быстрого API, а затем использовать его объект для создания маршрутов, как в обычном приложении FastAPI.

Давайте посмотрим пример. Предположим, мы создаем систему управления библиотекой и хотим обрабатывать книги и новые данные отдельно. Пусть это будет код для файла book.py:

А это код файла романа.py:

Теперь, чтобы включить оба маршрутизатора в основное приложение, просто импортируйте объект APIRouter и передайте их в функцию include_router основного объекта приложения FastAPI. Мы также добавим префиксы для этих маршрутизаторов, чтобы одни и те же конечные точки на обоих маршрутизаторах не конфликтовали. См. реализацию ниже:

Если вы нажмете конечные точки «/book/info» и «/novel/info», вы получите разные ответы в зависимости от того, как вы обработали эти входные данные в APIRouters.

Таким образом, у вас может быть несколько APIRouters для обработки параметров в зависимости от того, какой тип операции вы хотите выполнить для этих групп конечных точек.

4. Добавьте статические файлы и шаблоны Jinja

FastAPI не ограничивается использованием в качестве основы для создания API. Вы можете обслуживать статические файлы, такие как HTML, CSS, JS, и включать механизм шаблонов Jinja, как в Flask. Это означает, что вы можете разместить полноценный веб-сайт с помощью FastAPI.

Позвольте мне соотнести это с Flask. Во фреймворке Flask у вас должна быть папка с названием «templates», где вы можете хранить все файлы HTML с шаблонами Jinja (дайте мне знать в комментариях, если вы хотите, чтобы я создал подробную статью о механизм шаблонов Jinja), а в основном приложении можно напрямую использовать функцию render_template из flask для возврата этих шаблонов с данными, которые должны быть заполнены в этих шаблонах.

В FastAPI на абстрактном уровне процесс остается тем же, но с небольшими изменениями. Пошаговый процесс: -

  1. Во-первых, вам нужно создать объект для шаблонов Jinja, где вам нужно указать путь к папке шаблонов. В FastAPI нет ограничений на имя папки, вы можете назвать ее как угодно. Вам нужно только указать путь к папке здесь. Технически вам нужно импортировать класс Jinja2Templates из модуля шаблонов быстрого API и создать объект для этого класса с путем к папке.
  2. Затем вам нужно указать response_class в методе маршрута FastAPI (например, GET, POST) в качестве класса HTMLResponse. Этот класс можно импортировать из модуля быстрых ответов API. Также необходимо создать параметр запроса типа класса «Запрос» в функции декоратора. Этот класс можно импортировать из модуля быстрого API.
  3. Чтобы отобразить и предоставить данные этим шаблонам при достижении соответствующих конечных точек, вам необходимо вернуть функцию «TemplateResponse» объекта класса Jinja2Templates. Эта функция принимает имя шаблона HTML и контекстный словарь. Словарь контекста должен иметь ключ «запрос» со значением в качестве параметра запроса, созданного вами в функции декоратора. Данные, которые будут отправлены в шаблоны Jinja, могут быть добавлены в этот словарь контекста как пара ключ-значение.

Вот реализация кода вышеуказанных шагов:

Теперь в шаблонах HTML вы можете заполнить переменные в соответствии с синтаксисом движка Jinja, используя имена, используемые в качестве ключей в контекстном словаре.

Запустите приложение FastAPI, и вы получите следующий вывод:

Чтобы включить все изображения, файлы JS и CSS в HTML, во Flask вы должны использовать url_for и указать имя папки как «статическое», за которым следует параметр имени файла. В FastAPI процесс проще. Просто,

  1. Создайте объект для класса StaticFiles из модуля статических файлов быстрого API и укажите путь к папке для статического файла. Опять же, никаких ограничений на имя папки.
  2. Смонтируйте этот объект статических файлов по одному из путей, предпочтительно «статическому», чтобы избежать путаницы, и предоставьте этому монтированию имя, которое будет использоваться FastAPI внутри.

Я добавил логику для статических файлов в тот же код, который используется для обслуживания файлов Jinja:

Теперь предположим, что у вас есть изображение «img1.png», которое вы хотите включить в свой HTML-файл. Просто в атрибуте src тега img используйте путь как:

/<path_on_which_static_files_are_mounted>/<image_directory>/<image_name>

(здесь каталог изображений зависит от вашей файловой структуры)

Вот обновленный код для используемого выше HTML-файла шаблона Jinja с тегом изображения:

И у нас будет вывод для этого как:

Таким образом, вы можете сложить все файлы и создать полноценный веб-сайт с поддержкой FastAPI.

5. Имитация обработки конфигурации Flask в приложении FastAPI

Если вы давно используете веб-фреймворк Flask, вы должны знать о конфигурациях приложений. Вы можете определить некоторые параметры вашего приложения, которые будут доступны из любой части приложения. Обычно они включают переменные среды. Атрибут config, подкласс структуры данных словаря, находится в объекте класса Flask. Здесь хранятся все конфигурации. Это особенно полезно, когда вы хотите жестко запрограммировать некоторые части приложения и вызывать их в любом месте приложения.

Вот что вы должны сделать в Flask, чтобы определить такие параметры конфигурации:

FastAPI не имеет такой поддержки. Хотя некоторые из вас могут подумать, что в этом случае можно использовать состояние приложения, но по предложению Тианголо (создателя FastAPI) APIRouter не будет иметь доступа к этому состоянию. Из-за этого, даже если вы сохраните некоторую конфигурацию в состоянии приложения, она не будет использоваться всеми частями приложения и, в конечном счете, не будет служить никакой цели.

Поэтому простой обходной путь, предложенный Тианголо, заключается в использовании класса Pydantic BaseSettings и создании модели для этих параметров. Этот класс предлагает функции проверки и аннотации типов. Эти функции отличают их от обычных переменных среды, где они могут обрабатывать только значения строкового типа.

Чтобы объединить это в своем приложении FastAPI, просто импортируйте класс BaseSettings из Pydantic и создайте подкласс для ваших настроек/конфигураций. Это классы Pydantic, поэтому вы можете добавлять значения по умолчанию, Field() и многое другое. Позвольте мне представить вам пример для реализации этого.

Ниже приведено содержимое файла config.py:

Здесь я определил openapi_url как пустую строку. Это отключит генерацию документов для приложения FastAPI. В основном файле приложения создайте объект для модели конфигурации и получите доступ к параметрам, как если бы вы делали это в структуре данных словарного типа:

Вот как вы можете использовать эту модель в качестве глобальной конфигурации вашего приложения. Это также устраняет зависимость от FastAPI для настройки других частей приложения.

Конечные примечания

Это были все расширенные варианты использования FastAPI, с которыми я столкнулся при разработке своих проектов. Хотя документация — лучший способ узнать больше об этих концепциях, я попытался предоставить более широкий и практический сценарий, в котором вы можете применить эти концепции. Расширенные варианты использования FastAPI не ограничиваются рассмотренными в этой статье. Это удивительный фреймворк, который постепенно захватывает всю технологическую индустрию.

Если вы хотите прочитать/изучить каждую мою статью, то перейдите к моему основному списку статей, который обновляется каждый раз, когда я публикую новую статью на любой платформе!

Если у вас есть любые сомнения, вопросы или потенциальные возможности, вы можете связаться со мной через:



Предыдущая статья: