【Streamlit】st.session_stateの内容を開発中にデバッグ表示する方法

Streamlit、st.session_Stateデバッグ表示の工夫 Streamlit
この記事は約9分で読めます。

こんにちは、JS2IIUです。
Webアプリを簡単に作れるPythonライブラリ「Streamlit」では、状態を管理するために st.session_state を使うことができます。特に、ボタンのクリック回数や入力フォームの値を保持する際に便利ですが、「今、どんな状態が保存されているのか?」を確認するには、ちょっとした工夫が必要です。

本記事では、st.session_state の中身を開発中にデバッグ表示する方法を、わかりやすくステップごとに解説します。さらに、実践的なコード例を使って、さまざまな場面での使い方を紹介します。

🔰 st.session_stateとは?

Streamlitはステートレス(状態を保持しない)仕組みが基本ですが、st.session_state を使うことで、ユーザーごとのセッション状態を保持できます。

たとえば、以下のような用途で活躍します:

  • ボタンを押した回数のカウント
  • フォームの入力値の保持
  • 条件によってUI表示を変更したいときのフラグ保存

ただし、値が正しく保存されているかどうかを確認するには、開発中に session_stateの中身を確認 する必要があります。

🔍 方法1: st.write(st.session_state) を使う

最も手軽な方法は、st.write() を使って session_state の内容を表示することです。

✅ サンプルコード

Python
import streamlit as st

st.write(st.session_state)

このコードをStreamlitアプリに追加するだけで、現在の session_state の内容がそのまま表示されます。辞書形式で出力されるため、キーと値の一覧を簡単に確認できます。

🧾 方法2: st.json(st.session_state) で整形表示する

もう少し見やすく表示したい場合は、st.json() を使いましょう。

✅ サンプルコード

Python
import streamlit as st

st.json(st.session_state)

JSON形式で階層構造が分かりやすく表示されるため、複雑な値やネストされたデータ構造を扱うときに便利です。

💡 実践例①:ボタンのクリック回数をカウント&デバッグ

ステップ1:セッションに初期値を設定

Python
if 'count' not in st.session_state:
    st.session_state.count = 0

ステップ2:ボタンをクリックするたびにカウントアップ

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

ステップ3:カウントと session_state を表示

Python
st.write(f"現在のカウント:{st.session_state.count}")
st.json(st.session_state)

🔁 完成コード

Python
import streamlit as st

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}")
st.json(st.session_state)

ボタンを押すたびにカウントが1ずつ増え、session_state に保存された値が表示されます。

💡 実践例②:フォームの入力内容を保持して表示

ステップ1:st.text_input にキーを指定

Python
name = st.text_input('お名前を入力してください', key='username')

ステップ2:挨拶メッセージと session_state を表示

Python
if st.session_state.username:
    st.write(f"こんにちは、{st.session_state.username} さん!")

st.json(st.session_state)

📄 完成コード

Python
import streamlit as st

name = st.text_input('お名前を入力してください', key='username')

if st.session_state.username:
    st.write(f"こんにちは、{st.session_state.username} さん!")

st.json(st.session_state)

フォームに入力した名前が session_state に自動的に保存され、再描画後も維持されます。

💡 実践例③:セレクトボックスとチェックボックスの状態を表示

ステップ1:選択式のウィジェットにキーを指定

Python
fruit = st.selectbox('好きなフルーツを選んでください', ['りんご', 'バナナ', 'ぶどう'], key='selected_fruit')
confirmed = st.checkbox('選択を確認しました', key='confirmed')

ステップ2:選択内容を表示& session_state 確認

Python
if confirmed:
    st.write(f"あなたの好きなフルーツは:{fruit} です")

st.json(st.session_state)

✅ 完成コード

Python
import streamlit as st

fruit = st.selectbox('好きなフルーツを選んでください', ['りんご', 'バナナ', 'ぶどう'], key='selected_fruit')
confirmed = st.checkbox('選択を確認しました', key='confirmed')

if confirmed:
    st.write(f"あなたの好きなフルーツは:{fruit} です")

st.json(st.session_state)

複数の状態をまとめて表示できるのが session_state の強みです。

💡 応用:開発中だけデバッグ表示する

本番ではデバッグ表示を消したいこともあります。そんなときは、サイドバーにチェックボックスを作って切り替え可能にしましょう。

✅ 実装コード

Python
import streamlit as st

st.title("デバッグ表示切り替えの例")

# 状態を管理
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}")

# デバッグ表示のON/OFF
show_debug = st.sidebar.checkbox("デバッグ表示をONにする")

if show_debug:
    st.json(st.session_state)

これで、サイドバーから「デバッグ表示」を切り替えることができます。

📝 まとめ

  • st.session_state は、Streamlitで状態管理をするための便利な仕組みです。
  • 状態を確認したいときは、st.write() または st.json() で中身を表示できます。
  • フォームやボタンなど、複数のウィジェットで状態を管理したいときに特に役立ちます。
  • 開発中に確認し、本番では非表示にする工夫も簡単にできます。

状態の確認ができれば、Streamlitアプリ開発がぐっとスムーズになります。ぜひ、あなたのアプリでも st.session_state のデバッグ表示を活用してみてください!

🔗 参考リンク

当ブログのStreamlit関連記事一覧です。こちらも参考にしていただけますと幸いです。ぜひご覧ください。

Streamlit
PythonのWEBフレームワークであるStreamlitについての記事を集めたページです。

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

コメント

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