Streamlit in Snowflake 其他功能¶
本主题介绍了 Streamlit in Snowflake 的其他功能。
自定义 Streamlit in Snowflake 中的 UI¶
自定义 UI 支持对 Streamlit in Snowflake 应用程序的外观、风格和前端行为进行自定义。此功能支持以下各项:
在 st.markdown (https://docs.streamlit.io/library/api-reference/text/st.markdown) 中使用
unsafe_allow_html=True
自定义 HTML 和 CSS使用 st.components.v1.html (https://docs.streamlit.io/develop/api-reference/custom-components/st.components.v1.html) 的内嵌式 HTML、CSS 和 JavaScript
备注
自定义 UI 有一些与内容安全策略 (CSP) 相关的限制。有关更多信息,请参阅 在 Streamlit in Snowflake 中加载外部资源时的限制。
要开始自定义 Streamlit in Snowflake 应用程序,只需调用 st.components.v1.html
,或调用 st.markdown
且 unsafe_allow_html=True
。提供的 HTML 将添加到用户浏览器中的应用程序前端。
备注
必须指定内联 HTML 或将 HTML 加载到字符串中。不能将 URL 或文件路径直接传递给要运行或嵌入的命令。
请参阅以下示例以自定义您的 Streamlit in Snowflake 应用程序:
自定义侧边栏背景颜色:
st.markdown(""" <style> [data-testid=stSidebar] { background-color: #94d3e6; } </style> """, unsafe_allow_html=True)
使用
streamlit-extras
添加应用程序徽标:运行之前,请务必安装
streamlit-extras
包。from streamlit_extras.app_logo import add_logo add_logo("./Logo.png", height=60)
以编程方式设置侧边栏宽度:
import streamlit.components.v1 as components components.html(""" <script> window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px"; </script> """, height=0)
使用
ydata-profiling
创建浏览器内 DataFrame 探索性数据分析 (EDA):import streamlit as st import streamlit.components.v1 as components from sklearn.datasets import load_iris from ydata_profiling import ProfileReport st.set_page_config(layout="wide") df = load_iris(as_frame=True).data html = ProfileReport(df).to_html() components.html(html, height=500, scrolling=True)
Streamlit in Snowflake 中的外部网络访问¶
您可以创建对 Snowflake 外部特定网络位置的安全访问,并且可以从 Streamlit 应用程序代码中使用该访问。可以通过外部访问集成启用访问权限。
要使 Streamlit 应用程序能够使用外部访问集成,可以运行 CREATE STREAMLIT 或 ALTER STREAMLIT 命令并设置 EXTERNAL_ACCESS_INTEGRATIONS 参数以包含该集成。
借助外部访问集成,可以使用访问外部位置的 Python 库(例如 requests
或者 urllib
),并使用需要访问网络位置的第三方库。
有关更多信息,请参阅 外部网络访问概述。
示例:访问 OpenAI API¶
以下示例显示了如何为向 OpenAI API 发出的出站请求创建外部访问集成。此示例包括设置安全集成并授予所需权限。
要创建表示外部网络位置和访问限制的网络规则,可以使用 CREATE NETWORK RULE 命令:
CREATE OR REPLACE NETWORK RULE network_rules MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('api.openai.com');
有关更多信息,请参阅 创建网络规则以表示外部网络位置。
要创建表示对外部网络位置进行身份验证所需凭据的密钥,可以使用 CREATE SECRET 命令:
CREATE OR REPLACE SECRET openai_key TYPE = GENERIC_STRING SECRET_STRING = '<any_string>';
有关更多信息,请参阅 创建表示凭据的密钥。
要创建外部访问集成,可以运行 CREATE EXTERNAL ACCESS INTEGRATION 命令,并将 ALLOWED_NETWORK_RULES 设置为您创建的网络规则,将 ALLOWED_AUTHENTICATION_SECRETS 设置为您创建的密钥:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int ALLOWED_NETWORK_RULES = (network_rules) ALLOWED_AUTHENTICATION_SECRETS = (openai_key) ENABLED = TRUE;
要授予所需权限以便使用 SECRET 和 INTEGRATION 对象对 Streamlit 应用程序创建器进行外部访问,可以使用 GRANT <privileges> 命令:
GRANT READ ON SECRET openai_key TO ROLE streamlit_app_creator_role; GRANT USAGE ON INTEGRATION openai_access_int TO ROLE streamlit_app_creator_role;
要使 Streamlit 应用程序能够使用集成,可以运行 ALTER STREAMLIT 命令,并将 EXTERNAL_ACCESS_INTEGRATIONS 属性设置为该集成:
USE ROLE streamlit_app_creator_role; ALTER STREAMLIT streamlit_db.streamlit_schema.streamlit_app SET EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int) SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
备注
还可以在运行 CREATE STREAMLIT 命令时指定 EXTERNAL_ACCESS_INTEGRATIONS 参数,从而设置新的 Streamlit 对象来使用外部访问集成:
CREATE STREAMLIT streamlit_db.streamlit_schema.streamlit_app ROOT_LOCATION = '<stage_path_and_root_directory>' MAIN_FILE = '<path_to_main_file_in_root_directory>' EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int) SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
在 Streamlit 应用程序代码中,调用外部 API:
from openai import OpenAI import streamlit as st import _snowflake st.title(":speech_balloon: Simple chat app using an external LLM") st.write("This app shows how to call an external LLM to build a simple chat application.") # Use the _snowflake library to access secrets secret = _snowflake.get_generic_secret_string('my_openai_key') client = OpenAI(api_key=secret) # ... # code to use API # ...
为 Streamlit 应用程序自定义睡眠计时器¶
您可以为 Streamlit 应用程序设置自定义睡眠计时器,以使其自动暂停。
要设置自定义睡眠计时器,请在
.streamlit
文件夹内创建config.toml
配置文件,此文件夹的路径由 STREAMLIT 对象的ROOT_LOCATION
参数指定。例如,如果希望 Streamlit 应用程序在 8 分钟后自动暂停,请在
config.toml
文件中添加以下内容:[snowflake] [snowflake.sleep] streamlitSleepTimeoutMinutes = 8
将
config.toml
文件上传到以下暂存区位置:PUT file:///<path_to_your_root_folder>/my_app/config.toml @streamlit_db.streamlit_schema.streamlit_stage/.streamlit/ overwrite=true auto_compress=false;
有关使用 Streamlit 文件的更多信息,请参阅 使用 SQL 创建和部署 Streamlit 应用程序。
备注
您可以将 streamlitSleepTimeoutMinutes
设置为介于 5 至 240 分钟之间的任意值。
如果未创建配置文件来指定计时器,默认自动暂停时间为 15 分钟。
Streamlit in Snowflake 中的上下文函数和行访问策略¶
要在 Streamlit in Snowflake 应用程序中使用 CURRENT_USER 等 上下文函数 以及具有 行访问策略 的表中的数据,具有 ACCOUNTADMIN 角色的用户必须将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色,如以下示例所示:
USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
备注
在 Streamlit in Snowflake 应用程序中,不能使用已使用了 CURRENT_ROLE 的行访问策略。Streamlit in Snowflake 应用程序以所有者权限运行,因此在 Streamlit 应用程序中使用 CURRENT_ROLE 将始终返回应用程序所有者角色。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序。
示例:使用 CURRENT_USER 访问具有行访问策略的表中的数据¶
您可以使用 Streamlit in Snowflake 应用程序来治理对受行访问策略保护的表中的行的访问。在行访问策略的正文中指定 CURRENT_USER 函数,并将行访问策略添加到表中。
以下示例演示了如何在 Streamlit in Snowflake 应用程序中治理对受行访问策略保护的表的访问。
创建表并插入数据:
CREATE TABLE row_access_policy_test_table ( id INT, some_data VARCHAR(100), the_owner VARCHAR(50) ); INSERT INTO row_access_policy_test_table (id, some_data, the_owner) VALUES (4, 'Some information 4', 'ALICE'), (5, 'Some information 5', 'FRANK'), (6, 'Some information 6', 'ALICE');
创建行访问策略:
CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy AS (the_owner VARCHAR) RETURNS BOOLEAN -> the_owner = CURRENT_USER();
将行访问策略添加到表中:
ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
创建一个 Streamlit 应用程序。
将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色:
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
将以下代码添加到 Streamlit 应用程序中:
# Import Python packages import streamlit as st from snowflake.snowpark.context import get_active_session st.title("CURRENT_USER() + Row Access Policy in SiS Demo :balloon:") st.write( """You can access `CURRENT_USER()` and data from tables with row access policies in Streamlit in Snowflake apps """) # Get the current credentials session = get_active_session() st.header('Demo') st.subheader('Credentials') sql = "SELECT CURRENT_USER();" df = session.sql(sql).collect() st.write(df) st.subheader('Row Access on a Table') sql = "SELECT * FROM st_db.st_schema.row_access_policy_test_table;" df = session.sql(sql).collect() st.write(df)