使用用户信息个性化您的 Streamlit 应用程序

|st.user|_API 让您的 |sis| 应用程序可以访问有关当前查看该应用程序的人员的信息。您可以使用此功能显示个性化问候语、按用户筛选数据或跟踪谁执行了操作。

st.user 在 Streamlit in Snowflake 中提供的内容

在 Streamlit in Snowflake 中,st.user 为当前查看者提供两个属性:

  • 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)。要显示更友好的名称,您可以使用 DESCRIBE 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 时包含查看者的身份:

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 用户名。在由使用所有者权限的 Streamlit in Snowflake 应用程序中,这是 Streamlit 对象的所有者,而不是查看者。要在 Python 代码中识别查看者,请改用 st.user

如果您在 SQL 查询中需要查看者的身份,请考虑使用受限的调用方权限(预览版)。在调用方权限受限的情况下,查询以查看者身份运行,因此 CURRENT_USER() 返回查看者的身份。有关更多信息,请参阅 受限制的调用方的权限和 Streamlit in Snowflake

运行时差异

st.user 在容器和仓库运行时中均可用。这两种环境中的行为相同:它返回查看应用程序的人员的身份,而不是 Streamlit 对象的所有者。