ユーザー情報によるStreamlitアプリのパーソナライズ

|st.user|_APIを使用すると、|sis|アプリは現在アプリを閲覧しているビューアーに関する情報にアクセスできます。これを使用して、パーソナライズされた挨拶を表示したり、ユーザーごとにデータをフィルタリングしたり、アクションを実行したユーザーを追跡したりできます。

|sis|におけるst.userが提供するもの

|sis|では、:code:`st.user`は現在のビューアーに対して2つの属性を提供します。

  • st.user.user_name:ビューアーのSnowflakeユーザー名。

  • st.user.email:ビューアーのメールアドレス。

次の例では、Snowflakeユーザー名を使用してビューアーに挨拶します。

import streamlit as st

st.write(f"Hello, {st.user.user_name}!")

ビューアーの表示名の取得(オプション)

st.user.user_name`はSnowflakeユーザー名を返します(例:``JSMITH`)。よりわかりやすい名前を表示するには、:doc:`DESCRIBEUSER</sql-reference/sql/desc-user>`を使用してユーザーの表示名を取得できます。これには高い権限が必要です。アプリ所有者のロールがユーザーオブジェクトに対するMONITOR権限を持っているか、アカウント管理者である必要があります。

次の例では、表示名を使用してビューアーに挨拶します。

import streamlit as st

conn = st.connection("snowflake")
session = conn.session()

user_info = session.sql(
    f"DESCRIBE USER {st.user.user_name}"
).collect()
display_name = st.user.user_name
for row in user_info:
    if row["property"] == "DISPLAY_NAME":
        display_name = row["value"]
        break

st.write(f"Hello, {display_name}!")

データクエリのパーソナライズ

各ビューアーに自身のデータのみが表示されるようにクエリ結果をフィルタリングします。この例では、キャッシュされた結果を返すのではなく、再実行のたびにクエリが新しく実行されるように、``session.sql()``を使用し、``conn.query()``は使用しません。

import streamlit as st

conn = st.connection("snowflake")
session = conn.session()
data = session.sql(
    "SELECT * FROM my_table WHERE owner = ?",
    params=[st.user.user_name],
).to_pandas()
st.dataframe(data)

アクションを実行したユーザーの追跡

データをSnowflakeに書き戻す際に、ビューアーのIDを含めます。

import streamlit as st

conn = st.connection("snowflake")
session = conn.session()

with st.form("entry_form"):
    value = st.text_input("Enter a value")
    submitted = st.form_submit_button("Save")

if submitted:
    session.sql(
        "INSERT INTO my_table (created_by, value) VALUES (?, ?)",
        params=[st.user.user_name, value],
    ).collect()
    st.success("Saved!")

CURRENT_USER()との関係

SQL関数CURRENT_USER()は、セッション所有者のSnowflakeユーザー名を返します。所有者権限を使用する|sis|アプリでは、これはビューアーではなくStreamlitオブジェクトの所有者になります。Pythonコードでビューアーを識別するには、代わりに:code:`st.user`を使用します。

SQLクエリでビューアーのIDが必要な場合は、制限付き呼び出し元権限(プレビュー)の使用を検討してください。制限付き呼び出し元権限では、クエリがビューアーとして実行されるため、CURRENT_USER()はビューアーのIDを返します。詳細については、 制限された呼び出し元権限と|sis| をご参照ください。

ランタイムの違い

:code:`st.user`は、コンテナランタイムとウェアハウスランタイムの両方で使用できます。動作はどちらの環境でも同じです。Streamlitオブジェクトの所有者ではなく、アプリを表示しているビューアーのIDを返します。