サイトアイコン アマチュア無線局JS2IIU

【Streamlit】セッションごとにユニークなIDや一意の情報を持たせる

Streamlit、st.session_sateセッションごとのIDを管理する

こんにちは、JS2IIUです。
今回もst.session_stateを実践で活用する事例の紹介です。セッションをIDで管理することでさまざまなメリットが得られます。今回もよろしくお願いします。

🔰 はじめに

StreamlitでWebアプリを作ると、複数のユーザーが同時にアプリを使うことがよくあります。こうした場合、「この人は誰か」「今のセッションでどんな操作をしたか」などを記録するために、セッションごとに一意なID(識別子)を持たせると非常に便利です。

この記事では、Pythonのuuidモジュールやtime.time()を使って、Streamlitアプリに一意なセッションIDを持たせる方法と、その活用例をわかりやすく解説します。

🧠 セッションとは?

まず、Streamlitにおけるセッションの意味を確認しましょう。

Streamlitでは、1つのブラウザ接続 = 1つのセッションとみなされます。ユーザーがページにアクセスすると、内部でセッションが作成され、各ユーザーの状態は st.session_state という辞書のような仕組みで管理されます。

つまり、st.session_state を使えば「このセッションのユーザーだけが持つ情報」を保存できるのです。

✅ セッションIDを持たせるメリット

セッションを識別するためのセッションIDを使うことによって得られるメリットの例を詳しくみていきます。

1. 🔍 ユーザーごとの識別が可能になる

Streamlitは基本的にステートレスなアプリです。認証機能がないと、誰がどんな操作をしているのかを追跡するのは難しいです。

セッションIDを導入することで、

💡 例:

2. 📄 ログ記録で原因追跡や分析がしやすくなる

アプリに不具合が起きたときや、特定の使い方を調査したいとき、セッションIDがあれば「いつ・誰が・何をしたか」をログから簡単に追えるようになります。

💡 例:

3. 💬 セッションごとの状態管理が容易になる

Streamlitでは st.session_state を使うことでセッションごとに変数を保持できます。セッションIDをキーとして使えば、複数ユーザーの状態を同時に処理できます。

💡 例:

4. 🔐 ログイン認証なしでも簡易的な識別ができる

本格的なログイン認証を導入しないケースでも、セッションIDを使えば最低限の識別ができます。

💡 例:

5. ⚙️ デバッグやテストが効率的になる

開発中に「このボタンを押すと何が起きるのか?」を確認したいときにも、セッションIDがあれば挙動を正確に確認できます。

💡 例:

6. 🧾 一時データの保存・一意なファイル名に利用できる

アップロードされたファイルや一時的なデータを保存する際、セッションIDをファイル名に含めることで他のユーザーのデータと衝突しません。

💡 例:
Python
filename = f"{st.session_state['session_id']}_upload.csv"

7. 📈 アナリティクスへの応用(セッション分析)

セッションIDを活用すれば、Google Analyticsのようにセッション単位の分析ができます。どれくらいの人がアプリを訪れたか、どんな操作が多いか、滞在時間などを記録できます。

🧠 まとめ:セッションIDがもたらす「見える化」と「管理性」

項目セッションIDによる効果
ユーザー識別匿名のままユーザーごとに追跡可能
状態管理ユーザーごとに独立した状態保持
ログ・エラー追跡発生箇所の特定や行動ログとの紐付けが容易
ファイル・データ管理一意の名前付けで他セッションとの混同防止
テスト・デバッグ支援セッション単位で原因の切り分けができる
アナリティクス・分析セッション単位の傾向把握が可能

🛠️ セッションIDを生成する方法

セッションごとの識別子を作成する方法として、以下の2つを紹介します。

✅ 方法1:uuid を使ってユニークなIDを作る

uuid は、重複しにくいランダムな文字列(UUID)を生成するための標準ライブラリです。

UUID(Universally Unique Identifier)とは、全世界で一意となる識別子を生成するための標準規格です。32桁の16進数で構成され、通常は8-4-4-4-12の形式(例:123e4567-e89b-12d3-a456-426614174000)で表されます。UUIDはシステムやネットワークをまたいでも重複することがほぼないため、ユーザーIDやセッションID、ファイル名、一時データ、データベースの主キーなど、さまざまな場面で広く利用されています。Pythonでは標準ライブラリのuuidモジュールを使って簡単に生成でき、特に uuid.uuid4() は乱数ベースで高い一意性を持つUUIDを生成します。ログやトラッキング、状態管理などの用途にも有効で、安全かつ簡易に識別子を管理したい場合に非常に便利な仕組みです。

📌 ステップ1:uuid モジュールをインポート

Python
import uuid

📌 ステップ2:セッションIDを生成して st.session_state に保存

Python
import streamlit as st
import uuid

# 初回のみセッションIDを生成
if "session_id" not in st.session_state:
    st.session_state["session_id"] = str(uuid.uuid4())

# 表示して確認
st.write(f"このセッションのID: {st.session_state['session_id']}")

✅ 結果

ブラウザを開くたびにユニークなIDが割り振られ、再読み込みしても同じセッション中はIDが変わりません。

✅ 方法2:time.time() を使って簡易的なIDを作る

もっとシンプルに、一意性を重視せず「タイミングだけで識別できればよい」という場合は、time.time()(現在時刻のUNIXタイム)を使うこともできます。

Python
import streamlit as st
import time

if "session_id" not in st.session_state:
    st.session_state["session_id"] = str(time.time())

st.write(f"このセッションのID: {st.session_state['session_id']}")

💡 実践例:セッションIDの活用

ここからは、セッションIDを実際に使った具体的な活用例を紹介します。

📘 例1:ユーザーごとの操作ログを記録する

アプリの使われ方を記録しておくと、改善や分析に役立ちます。セッションIDをログに含めれば、どのユーザーが何をしたか追跡できます。

Python
import streamlit as st
import uuid
import logging

# セッションIDを生成
if "session_id" not in st.session_state:
    st.session_state["session_id"] = str(uuid.uuid4())

# ログ設定
logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s"
)

# ログ出力
logging.info(f"Session {st.session_state['session_id']}: アプリが起動しました。")

# UI
st.write("アプリが起動しました。ログファイルにセッションID付きで記録されます。")

📘 例2:チャット入力をセッションごとに記録する

Streamlitでシンプルなチャットアプリを作る場合、誰がどのメッセージを送ったかを記録するのにセッションIDが便利です。

Python
import streamlit as st
import uuid
import pandas as pd

# セッションIDの生成
if "session_id" not in st.session_state:
    st.session_state["session_id"] = str(uuid.uuid4())

# チャット履歴の初期化
if "chat_log" not in st.session_state:
    st.session_state["chat_log"] = []

# 入力フォーム
message = st.text_input("メッセージを入力してください:")

# 送信ボタンで履歴追加
if st.button("送信") and message:
    st.session_state["chat_log"].append({
        "session_id": st.session_state["session_id"],
        "message": message
    })

# チャット履歴を表示
df = pd.DataFrame(st.session_state["chat_log"])
st.dataframe(df)

📘 例3:一時的な状態をセッション単位で保持する

例えばアンケートやステップ型フォームで進捗をセッション単位に記録する場合にも、セッションIDが活躍します。DBなどに保存する際のキーにもなります。

⚠️ 注意点

✅ まとめ

Streamlitアプリにおいて、セッションごとに一意なIDを持たせることは、ログ記録・ユーザー識別・状態管理にとても役立ちます。

本記事では以下を学びました:

シンプルな工夫ですが、アプリの信頼性や保守性をぐっと高めることができます。ぜひあなたのアプリにも取り入れてみてください!

🔗 参考リンク

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了