Визуализация данных

Как создать галерею приложений Streamlit как единое веб-приложение

Загрузите бесплатный шаблон, вставьте несколько приложений Streamlit, и все готово.

Я немного поигрался со Streamlit и написал несколько экспериментальных приложений. Хотя я ими вполне доволен (пока они идут — это всего лишь простые примеры), ни один из них не достоин отдельной веб-страницы.

Итак, как лучше всего представить галерею приложений, к которым можно получить доступ с одной веб-страницы?

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

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

Это звучит лучше, я думаю.

Mustrap простой фреймворк

Итак, с этой целью я создал шаблон приложения под названием Mustrapp(Multiple StreamlitApps ), (которое вы можете скачать бесплатно), что делает процесс создания нескольких приложений Streamlit очень простым.

Чтобы приложения работали, вам нужно структурировать их так, чтобы они находились в вызываемой функции с именем run(). И, в идеале (но не обязательно), содержать строку описания, которая будет использоваться в качестве текста в раскрывающемся меню (если вы его не укажете, будет использоваться имя модуля).

Итак, приложение будет выглядеть так:

description = "My first app"
def run():
   st.header("This is my first app")
   st.write("I hope you like it")
if __name__ == "__main__":
   run()

У вас может быть сколько угодно функций в приложении, но оно должно начинаться с функции с именем run , и это единственное требование. Последний оператор if является необязательным, но полезным, поскольку позволяет запускать отдельное приложение как отдельное приложение или как часть мультиприложения. По сути, он проверяет, была ли функция вызвана в качестве основного модуля (в этом случае ее __name__ будет __main__). Если он вызывается как библиотечный модуль (что мы и собираемся сделать), то __name__ будет именем модуля.

Возможность запускать приложение как автономную функцию может быть полезна для отладки, поскольку вам не нужно, чтобы остальная часть приложения работала.

Допустим, вы написали приложение выше и сохранили его в файле app1.py.

Затем вы можете написать другое приложение, app2.py, которое выглядит так:

description = "My second app"
def run():
   st.header("This is my second app")
   st.write("Here is an image:")
   st.image("image.png")
if __name__ == "__main__":
   run()

Затем мы помещаем эти файлы в папку с именем, например, stlib — это будет папка нашей библиотеки, где будут жить все наши приложения. Чтобы Python распознал эту папку как библиотеку, в ней должен быть файл с именем __init__.py. Если вы скачали шаблон, он уже есть.

Диспетчер живет в домашней папке. Это программа, которая будет запускаться при запуске приложения Streamlit. Я назову его index.py.

Таким образом, наше полное приложение структурировано следующим образом:

/home
 |
 |-- index.py
 |
 |-- /stlib
       |
       |-- __init__.py
       |
       |-- app1.py
       |
       |-- app2.py

Чтобы запустить приложение, выполните следующее:

streamlit run index.py

И это появится в вашем браузере:

Вы можете увидеть полный код диспетчера в Gist в самом конце этой статьи (он слишком длинный, чтобы включать его сюда). И в конце я также включу ссылку на репозиторий Github, где вы можете клонировать или загрузить zip-файл полного шаблона, включая диспетчер, структуру каталогов и пару фиктивных приложений.

Но в основном это работает так.

Сначала мы импортируем библиотеку Streamlit (разумеется) вместе с другими библиотеками, которые нам нужны. (Это также устанавливает макет на широкий.Этонеобязательно, но, на мой взгляд, будет лучше, если вы собираетесь использовать боковую панель, как мы делаем здесь — это может удалить, если хотите.)

Затем мы приступаем к идентификации приложений в библиотеке (stlib) и записываем имена, ссылки на модули и описания приложений в глобальные массивы с именами names, modules и descriptions. Любой модуль в библиотеке stlib считается приложением Streamlit, если его имя не начинается с символа _. Таким образом, вы можете добавить модули библиотеки, не относящиеся к приложениям (например, _mylibrary.py), если вам это нужно, и они не будут восприниматься как приложения Streamlit.

Сделав это, мы создаем раскрывающееся меню, заполненное именами модулей (описания отображаются, если они доступны), и после выбора соответствующий модуль выбирается из массива modules, и выполняется его функция run(). Другими словами, запускается приложение, соответствующее выбору.

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

Ничего из этого не является ракетостроением, но я надеюсь, что это было полезно. Вы можете увидеть пример веб-сайта, который использует этот шаблон здесь, и вы можете загрузить или клонировать полный шаблон из его репозитория Github.

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



Вот, для интереса, код диспетчера: