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

【Streamlit】st.session_stateを使った簡易ログインシステム

Streamlit、st.session_state簡易的なログイン機能

こんにちは、JS2IIUです。
今回はStreamlitアプリにユーザーごとのログイン機能を設置するための基本的な手順を紹介していきます。よろしくお願いします。

1. はじめに

Streamlit は Python だけで簡単に Web アプリを作ることができるフレームワークです。ですが、少し複雑なアプリを作ろうとすると、**「ログイン機能」**のようなユーザーごとの状態を管理したくなることがあります。

そんなときに活躍するのが st.session_state です。この仕組みを使うことで、ログイン状態をセッションごとに保持することができます。

本記事では、以下のようなシンプルなログイン機能を作成しながら、st.session_state の使い方を詳しく解説します。

2. st.session_state とは?

Streamlit はコードを上から順に何度も再実行するため、普通の変数では毎回初期化されてしまい、状態が保存されません。そこで使うのが st.session_state です。

これは、ユーザーのセッションごとに値を保持できる辞書のようなオブジェクトで、以下のような使い方ができます。

Python
st.session_state["my_key"] = "保存したい値"

再実行されてもこの値はセッション中ずっと保持されるため、ログイン状態のような一時的な情報を管理するのに非常に便利です。

3. 【基本編】シンプルなログイン機能を作ってみよう

🎯 目標

🧩 ステップ1:ユーザー情報の定義

まずはログインに使うユーザー名とパスワードを定義します。ここでは簡単のため、辞書形式で固定の情報を使います。

Python
USER_CREDENTIALS = {
    "user1": "password123",
    "admin": "adminpass"
}

実際のアプリではこの情報をデータベースなどで管理するのが理想ですが、今回は学習用の簡易実装です。

🧩 ステップ2:セッションの初期化

Streamlit の session_state を使って、ログイン状態とユーザー名を初期化します。これをアプリの最初に記述します。

Python
if "logged_in" not in st.session_state:
    st.session_state["logged_in"] = False
    st.session_state["username"] = ""

🧩 ステップ3:ログインフォームの作成

ユーザー名とパスワードを入力するフォームを表示し、「ログイン」ボタンが押されたら入力情報をチェックします。

Python
import streamlit as st

USER_CREDENTIALS = {
    "user1": "password123",
    "admin": "adminpass"
}

# セッション初期化
if "logged_in" not in st.session_state:
    st.session_state["logged_in"] = False
    st.session_state["username"] = ""

# ログイン状態で処理を分ける
if not st.session_state["logged_in"]:
    st.title("ログインページ")

    username = st.text_input("ユーザー名")
    password = st.text_input("パスワード", type="password")

    if st.button("ログイン"):
        if username in USER_CREDENTIALS and USER_CREDENTIALS[username] == password:
            st.session_state["logged_in"] = True
            st.session_state["username"] = username
            st.success("ログイン成功!")
        else:
            st.error("ユーザー名またはパスワードが間違っています。")

🧩 ステップ4:ログイン後の表示とログアウト機能

ログイン後はユーザー名を表示し、ログアウトできるようにします。

Python
else:
    st.title("ホームページ")
    st.write(f"ようこそ、{st.session_state['username']}さん!")

    if st.button("ログアウト"):
        st.session_state["logged_in"] = False
        st.session_state["username"] = ""
        st.info("ログアウトしました。")

✅ 完成コード(全体)

Python
import streamlit as st

USER_CREDENTIALS = {
    "user1": "password123",
    "admin": "adminpass"
}

# セッション初期化
if "logged_in" not in st.session_state:
    st.session_state["logged_in"] = False
    st.session_state["username"] = ""

if not st.session_state["logged_in"]:
    st.title("ログインページ")

    username = st.text_input("ユーザー名")
    password = st.text_input("パスワード", type="password")

    if st.button("ログイン"):
        if username in USER_CREDENTIALS and USER_CREDENTIALS[username] == password:
            st.session_state["logged_in"] = True
            st.session_state["username"] = username
            st.success("ログイン成功!")
        else:
            st.error("ユーザー名またはパスワードが間違っています。")
else:
    st.title("ホームページ")
    st.write(f"ようこそ、{st.session_state['username']}さん!")

    if st.button("ログアウト"):
        st.session_state["logged_in"] = False
        st.session_state["username"] = ""
        st.info("ログアウトしました。")

4. 応用例:ユーザーによって表示を切り替える

ログインしたユーザーに応じて、表示内容を切り替えることもできます。

Python
if st.session_state["username"] == "admin":
    st.write("管理者メニュー")
else:
    st.write("一般ユーザーメニュー")

これにより、ユーザーの種類に応じてアクセス制限や機能制御ができるようになります。

5. セキュリティに関する注意点

このログイン機能は学習・デモ用の簡易的な実装です。実際のアプリに組み込む場合は、以下の点に注意してください。

6. まとめ

🔗 参考リンク

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

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