PythonだけでインタラクティブなWebアプリ(ダッシュボード)を驚くほど簡単に作成できるライブラリ、Streamlit。データ分析の結果を共有したり、自分専用のツールを作成したりするのに最適です。
しかし、機能が増えてくると1つのPythonファイル(app.py)が肥大化し、管理が難しくなりがちです。この記事では、Streamlitの標準機能である「マルチページアプリ」機能を使い、app.pyをメインの入り口(アクセスポイント)としつつ、機能ごとにファイルを分割して拡張性を高める方法をメインに解説します。
1. Streamlitで作るダッシュボードアプリケーション
Streamlitは、Pythonスクリプトを上から下に実行し、その過程でst.title()やst.dataframe()といった専用の関数を呼び出すだけで、自動的にWebインターフェースを構築してくれます。
まずは、すべての機能の「ハブ」となるメインのapp.pyを作成します。このファイルは、ダッシュボードの「ホームページ」として機能します。
メインファイル (app.py) の基本形
この時点では、メインページは非常にシンプルです。訪問者を歓迎し、サイドバーから他の機能へ移動するように促すだけです。
# app.py
import streamlit as st
# ページの基本設定
st.set_page_config(
page_title="自分用ダッシュボード",
page_icon="🏠",
layout="wide"
)
st.title("🏠 メインダッシュボード")
st.sidebar.success("上のメニューから機能を選択してください。")
st.markdown(
"""
### ようこそ!
このダッシュボードは、Streamlitのマルチページ機能を使って構築されています。
左側のサイドバーから、以下のページにアクセスできます。
- **データ分析ページ**: サンプルデータの分析
- **グラフ可視化ページ**: サンプルグラフの表示
"""
)
2. 機能を追加する際に別ファイルを作成して呼び出す方法
Streamlitには、アプリを複数のページに分割するための非常に簡単な機能が組み込まれています。これにより、app.pyをすっきりと保ちながら、機能(ページ)を簡単に追加・削除できます。
魔法の `pages` ディレクトリ
app.py と同じ階層に pages という名前のディレクトリを作成するだけです。Streamlitは、この pages ディレクトリの中にある .py ファイルを自動的に検出し、サイドバーにナビゲーションリンクとして追加します。
ファイル構造は以下のようになります。
your_dashboard/
├── app.py (メインページ)
└── pages/
├── 1_data_analysis.py (機能A)
└── 2_visualization.py (機能B)
ファイル名の先頭に [数字]_[アンダースコア] をつけると、サイドバーでの表示順序を制御できます。
機能ファイル (1_data_analysis.py) の例
これが「データ分析」機能の本体です。app.py とは完全に独立したファイルとして記述できます。
# pages/1_data_analysis.py
import streamlit as st
import pandas as pd
import numpy as np
# ページ固有の設定
st.set_page_config(page_title="データ分析", page_icon="📊")
st.title("📊 データ分析ページ")
st.write("ここではサンプルデータ分析を行います。")
# サンプルデータの生成と表示
@st.cache_data # データをキャッシュ
def get_data():
return pd.DataFrame(
np.random.randn(50, 5),
columns=[f"カラム{i+1}" for i in range(5)]
)
df = get_data()
st.dataframe(df)
st.subheader("データの統計情報")
st.write(df.describe())
機能ファイル (2_visualization.py) の例
同様に、グラフ描画機能も別ファイルとして作成します。
# pages/2_visualization.py
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
st.set_page_config(page_title="グラフ可視化", page_icon="📈")
st.title("📈 グラフ可視化ページ")
st.write("ここではサンプルグラフを表示します。")
# スライダーでパラメータを変更
num_points = st.slider("プロットする点の数", 10, 1000, 100)
amplitude = st.slider("振幅", 1.0, 10.0, 5.0)
# サンプルグラフの表示
x = np.linspace(0, 10, num_points)
y = amplitude * np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
st.pyplot(fig)
このようにファイルを分割することで、app.py はハブとして機能し、実際の機能は pages/ 以下のファイルで管理できます。機能追加も、新しい .py ファイルを pages/ に追加するだけで完了です。
3. Streamlit Community Cloud (旧 Streamlit.io) へのデプロイ
ローカルで作成したダッシュボードは、Streamlitが公式に提供する無料のホスティングサービス「Streamlit Community Cloud」を使えば、簡単に世界中に公開できます。
デプロイの簡単ステップ
- GitHubリポジトリの準備:
作成したStreamlitアプリのファイル(app.py,pages/ディレクトリ)をGitHubのリポジトリにプッシュします。 requirements.txtの作成:
アプリの実行に必要なライブラリ(streamlit,pandas,matplotlibなど)をリストアップしたrequirements.txtファイルを作成し、リポジトリに含めます。streamlit pandas matplotlib- Streamlit Community Cloud にサインアップ:
Streamlit Community Cloud に、ご自身のGitHubアカウントでサインアップ(またはログイン)します。 - アプリのデプロイ:
ダッシュボードから「New app」ボタンを押し、デプロイしたいGitHubリポジトリ、ブランチ(例: main)、メインファイル(app.py)を指定して「Deploy!」ボタンをクリックします。
これだけで、数分後には https://[あなたのアプリ名].streamlit.app のようなURLでアプリが公開されます。
4. Streamlit Community Cloudでの認証機能
「自分用のダッシュボード」として使う場合、他人には見られたくないことも多いでしょう。Streamlit Community Cloud には、標準で簡単な認証(アクセス制限)機能が備わっています。
標準のメールベース認証
プログラム側で複雑な認証機能を実装しなくても、Streamlit Community Cloud の管理画面からアクセス制限をかけることができます。
- デプロイしたアプリの管理画面(右上の「Manage app」など)に移動します。
- 「Settings」タブ(または「Sharing」)を開きます。
- アプリの可視性(Visibility)を「Public」(誰でも見られる)から「Private」に変更します。
- 「Viewers」の欄に、閲覧を許可したい人のGoogleアカウント(Gmail)またはメールアドレスを追加します。
これにより、指定したアカウントでログインしているユーザー(または招待メールを受け取ったユーザー)のみがダッシュボードにアクセスできるようになります。
(参考) より高度な認証
もし、独自のID/パスワード認証など、より柔軟な認証システムを実装したい場合は、streamlit-authenticator のようなサードパーティ製のライブラリを利用する方法もあります。これはアプリのPythonコード内で認証ロジックを組むことになりますが、設定には少し手間がかかります。
「自分用」かつ「手軽に」という目的であれば、Streamlit Community Cloud 標準のメール認証機能が最も簡単で強力です。
まとめ
Streamlitのマルチページ機能(pages/ ディレクトリ)を活用することで、メインの app.py をすっきりと保ちつつ、機能ごとにファイルを分けて拡張性の高いダッシュボードを構築できます。さらに、Streamlit Community Cloud を使えば、デプロイから認証設定までを数クリックで完了できます。
ぜひ、あなた専用の便利ツールやダッシュボードを作成してみてください。