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.markdownunsafe_allow_html=True。提供的 HTML 将添加到用户浏览器中的应用程序前端。

备注

必须指定内联 HTML 或将 HTML 加载到字符串中。不能将 URL 或文件路径直接传递给要运行或嵌入的命令。

请参阅以下示例以自定义您的 Streamlit in Snowflake 应用程序:

  • 自定义侧边栏背景颜色:

    st.markdown("""
      <style>
        [data-testid=stSidebar] {
          background-color: #94d3e6;
        }
      </style>
    """, unsafe_allow_html=True)
    
    Copy
  • 使用 streamlit-extras 添加应用程序徽标:

    运行之前,请务必安装 streamlit-extras 包。

    from streamlit_extras.app_logo import add_logo
    add_logo("./Logo.png", height=60)
    
    Copy
  • 以编程方式设置侧边栏宽度:

    import streamlit.components.v1 as components
    
    components.html("""
      <script>
        window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px";
      </script>
    """, height=0)
    
    Copy
  • 使用 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)
    
    Copy

Streamlit in Snowflake 中的外部网络访问

您可以创建对 Snowflake 外部特定网络位置的安全访问,并且可以从 Streamlit 应用程序代码中使用该访问。可以通过外部访问集成启用访问权限。

要使 Streamlit 应用程序能够使用外部访问集成,可以运行 CREATE STREAMLITALTER STREAMLIT 命令并设置 EXTERNAL_ACCESS_INTEGRATIONS 参数以包含该集成。

借助外部访问集成,可以使用访问外部位置的 Python 库(例如 requests 或者 urllib),并使用需要访问网络位置的第三方库。

有关更多信息,请参阅 外部网络访问概述

示例:访问 OpenAI API

以下示例显示了如何为向 OpenAI API 发出的出站请求创建外部访问集成。此示例包括设置安全集成并授予所需权限。

  1. 要创建表示外部网络位置和访问限制的网络规则,可以使用 CREATE NETWORK RULE 命令:

    CREATE OR REPLACE NETWORK RULE network_rules
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('api.openai.com');
    
    Copy

    有关更多信息,请参阅 创建网络规则以表示外部网络位置

  2. 要创建表示对外部网络位置进行身份验证所需凭据的密钥,可以使用 CREATE SECRET 命令:

    CREATE OR REPLACE SECRET openai_key
      TYPE = GENERIC_STRING
      SECRET_STRING = '<any_string>';
    
    Copy

    有关更多信息,请参阅 创建表示凭据的密钥

  3. 要创建外部访问集成,可以运行 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;
    
    Copy
  4. 要授予所需权限以便使用 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;
    
    Copy
  5. 要使 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);
    
    Copy

    备注

    还可以在运行 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);
    
    Copy
  6. 在 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
    # ...
    
    Copy

为 Streamlit 应用程序自定义睡眠计时器

您可以为 Streamlit 应用程序设置自定义睡眠计时器,以使其自动暂停。

  1. 要设置自定义睡眠计时器,请在 .streamlit 文件夹内创建 config.toml 配置文件,此文件夹的路径由 STREAMLIT 对象的 ROOT_LOCATION 参数指定。

    例如,如果希望 Streamlit 应用程序在 8 分钟后自动暂停,请在 config.toml 文件中添加以下内容:

    [snowflake]
    [snowflake.sleep]
    streamlitSleepTimeoutMinutes = 8
    
    Copy
  2. 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;
    
    Copy

有关使用 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;
Copy

备注

在 Streamlit in Snowflake 应用程序中,不能使用已使用了 CURRENT_ROLE 的行访问策略。Streamlit in Snowflake 应用程序以所有者权限运行,因此在 Streamlit 应用程序中使用 CURRENT_ROLE 将始终返回应用程序所有者角色。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序

示例:使用 CURRENT_USER 访问具有行访问策略的表中的数据

您可以使用 Streamlit in Snowflake 应用程序来治理对受行访问策略保护的表中的行的访问。在行访问策略的正文中指定 CURRENT_USER 函数,并将行访问策略添加到表中。

以下示例演示了如何在 Streamlit in Snowflake 应用程序中治理对受行访问策略保护的表的访问。

  1. 创建表并插入数据:

    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');
    
    Copy
  2. 创建行访问策略:

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. 将行访问策略添加到表中:

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. 创建一个 Streamlit 应用程序。

  5. 将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色:

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. 将以下代码添加到 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)
    
    Copy
语言: 中文