スポンサーリンク
Pythonstreamlit

Streamlitのst.session_state完全ガイド:シンプルな実例で核心を理解する

Python
この記事は約6分で読めます。

はじめに

Streamlitは、Pythonで驚くほど簡単にWebアプリケーションを作成できる素晴らしいフレームワークです。しかし、インタラクティブなアプリを作る上で避けては通れない、そして唯一と言っていいほど理解が必要な機能が**st.session_state**です。

これは、ユーザーの操作(ボタンクリックなど)をまたいで状態(データ)を保持するための重要な仕組みです。st.session_stateを使いこなせるかどうかで、アプリのできる事が格段に変わります。この記事では、st.session_stateの核心を、分かりやすい実例と共に解説します。

実例①:カウンターアプリ

st.session_stateの必要性を、簡単なカウンターアプリで見てみましょう。ボタンを押すたびに数字が1ずつ増えるアプリを作りたいとします。

❌ session_stateを使わない場合(うまく動かない)

このコードでは、ボタンが押されるたびにcount変数は0にリセットされ、その後+1されるため、何度押しても「カウント: 1」としか表示されません。

import streamlit as st

count = 0

if st.button("カウントアップ"):
    count += 1

st.write(f"カウント: {count}")

✅ session_stateを使った場合(正しく動作)

st.session_stateを使うと、再実行されても値が保持されるため、ボタンを押すたびにカウントが正しく増えていきます。

import streamlit as st

# session_stateの初期化
if "count" not in st.session_state:
    st.session_state.count = 0

if st.button("カウントアップ"):
    st.session_state.count += 1

st.write(f"カウント: {st.session_state.count}")

アプリ画面

カウントアップされている

if “xxx” not in st.session_state: の意味

st.session_stateを使ったコードで必ずと言っていいほど目にするのが、このif文です。

if "count" not in st.session_state:
    st.session_state.count = 0

これは、st.session_state“count”というキーがまだ存在しない場合(つまり、アプリの初回実行時)に、キーを作成して初期値0を代入するという意味です。

この初期化処理がないと、st.session_state.count += 1を実行しようとした際に、「countなんていうキーは存在しません」というエラーが発生してしまいます。st.session_stateを使い始める際のおまじないとして覚えておきましょう。

実例②:コールバック関数で入力履歴を保存

st.session_stateは、ウィジェットの操作に応じて特定の関数を呼び出すコールバック機能と非常に相性が良いです。

❌ session_stateを使わない場合(うまく動かない)

テキストを入力しても、再実行のたびにhistoryリストが空になってしまうため、履歴は保存されません。

import streamlit as st

history = []

def save_input():
    # このhistoryはローカル変数なので、再実行で消えてしまう
    history.append(st.session_state.user_input)

st.text_input("メッセージを入力", key="user_input", on_change=save_input)

st.write("履歴:", history)

✅ session_stateを使った場合(正しく動作)

st.session_state内に履歴用のリストを持つことで、入力のたびに正しく履歴が蓄積されていきます。

import streamlit as st

# コールバック関数
def save_input():
    # session_state内のリストに追加する
    st.session_state.history.append(st.session_state.user_input)

# session_stateの初期化
if "history" not in st.session_state:
    st.session_state.history = []

st.text_input("メッセージを入力", key="user_input", on_change=save_input)

st.write("履歴:", st.session_state.history)

アプリ画面

履歴が蓄積されている

コールバック関数とは?

st.buttonst.text_inputなどのウィジェットには、on_clickon_changeといった引数があります。ここに関数を指定すると、ユーザーがそのウィジェットを操作したタイミングで指定した関数が呼び出されます。この仕組みをコールバックと呼びます。

その他の便利な使用ケース

st.session_stateの応用範囲は広いです。

  1. ページ間のデータ共有 マルチページアプリで、あるページで入力されたユーザー名を別のページで表示するなど、ページをまたいでデータを引き継ぐことができます。
  2. フォーム入力の保持 ユーザーがフォームを送信した後にエラーがあった場合でも、入力内容を保持して再表示することができます。
  3. 一時的なフラグ管理 「ボタンが押されたらアラートを表示する」といった、一度きりのイベントを管理するためのフラグとしても利用できます。

session_stateが切れるタイミングは? 💨

st.session_stateに保存されたデータは永続的ではありません。以下のタイミングでリセットされます。

  • ブラウザのタブを閉じる
  • ページをリロード(再読み込み)する
  • Streamlitサーバーを再起動する
  • セッションがタイムアウトする(サーバーの設定による)

まとめ

st.session_stateは、ユーザーの操作に応じて状態が変化する動的なStreamlitアプリを作るための必須ツールです。

  • ポイント
    • Streamlitは操作のたびに再実行されるため、状態保持にはst.session_stateが不可欠。
    • st.session_stateは辞書のようにキーと値でデータを管理する。
    • if “key” not in st.session_state:で初期化を忘れないことが重要。
    • ボタン、テキスト入力、コールバックなど、あらゆるウィジェットと組み合わせて使える。
    • セッションが終了するとデータはリセットされる。

st.session_stateをマスターすれば、作れるアプリの幅がぐっと広がります。ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました