こんにちは、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があれば「いつ・誰が・何をしたか」をログから簡単に追えるようになります。
💡 例:
- エラーが起きたログにセッションIDを残しておくことで、問題が起きたセッションを特定できる
- アプリの利用状況をセッションIDでグループ化し、ユーザー行動分析が可能
3. 💬 セッションごとの状態管理が容易になる
Streamlitでは st.session_state を使うことでセッションごとに変数を保持できます。セッションIDをキーとして使えば、複数ユーザーの状態を同時に処理できます。
💡 例:
- アンケートの途中経過や、ステップ形式のフォームの進捗状況をセッションごとに保存
- データベースにセッション単位の記録を残して、後から復元可能にする
4. 🔐 ログイン認証なしでも簡易的な識別ができる
本格的なログイン認証を導入しないケースでも、セッションIDを使えば最低限の識別ができます。
💡 例:
- デモアプリや社内ツールで、ユーザー名やパスワードを使わずに行動追跡が可能
- 同じ端末で何回もアクセスされても、セッションごとの違いを区別できる
5. ⚙️ デバッグやテストが効率的になる
開発中に「このボタンを押すと何が起きるのか?」を確認したいときにも、セッションIDがあれば挙動を正確に確認できます。
💡 例:
- テスト環境で複数のセッションを立ち上げ、それぞれの状態を追跡可能
- セッション単位で出力されるログを使って、バグの再現性を確認できる
6. 🧾 一時データの保存・一意なファイル名に利用できる
アップロードされたファイルや一時的なデータを保存する際、セッションIDをファイル名に含めることで他のユーザーのデータと衝突しません。
💡 例:
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 モジュールをインポート
import uuid📌 ステップ2:セッションIDを生成して st.session_state に保存
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タイム)を使うこともできます。
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をログに含めれば、どのユーザーが何をしたか追跡できます。
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が便利です。
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などに保存する際のキーにもなります。
⚠️ 注意点
- セッションIDは認証やセキュリティの代替ではありません。ログイン処理などには、適切な認証機能を使いましょう。
- ブラウザの再読み込みや接続の切断によって、セッションIDが変わることがあります。
- UUIDのような識別子はログや外部出力に使う際には取り扱いに注意してください(個人識別情報ではありませんが、匿名性に配慮しましょう)。
✅ まとめ
Streamlitアプリにおいて、セッションごとに一意なIDを持たせることは、ログ記録・ユーザー識別・状態管理にとても役立ちます。
本記事では以下を学びました:
uuidやtime.time()を使ったセッションIDの作り方st.session_stateを使ってIDをセッション内で保持する方法- 実践的な活用例(ログ記録、チャット、状態保持)
シンプルな工夫ですが、アプリの信頼性や保守性をぐっと高めることができます。ぜひあなたのアプリにも取り入れてみてください!
🔗 参考リンク
最後まで読んでいただきありがとうございます。

