Zusätzliche Streamlit in Snowflake-Features

Dieses Thema beschreibt zusätzliche Features von Streamlit in Snowflake.

Benutzerdefinierte UI in Streamlit in Snowflake

Mit der benutzerdefinierten UI können Sie das Aussehen, die Bedienung und die Verhaltensweise der Streamlit in Snowflake-Anwendungen anpassen. Diese Funktion unterstützt Folgendes:

Bemerkung

Die benutzerdefinierte UI unterliegt einigen Einschränkungen im Zusammenhang mit der Inhaltssicherheitsrichtlinie (CSP). Weitere Informationen dazu finden Sie unter Beschränkungen beim Laden externer Ressourcen in Streamlit in Snowflake.

Um mit der Anpassung Ihrer Streamlit in Snowflake App zu beginnen, rufen Sie einfach st.components.v1.html an, oder st.markdown mit unsafe_allow_html=True. Die bereitgestellte HTML wird dem Frontend der App im Browser des Benutzers hinzugefügt.

Bemerkung

Sie müssen die Inline-HTML angeben oder die HTML in eine Zeichenfolge laden. Sie können keine URL oder einen Pfad zu einer Datei direkt an den auszuführenden oder einzubettenden Befehl übergeben.

Sehen Sie sich die folgenden Beispiele für die Anpassung Ihrer Streamlit in Snowflake Anwendungen an:

  • Passen Sie die Hintergrundfarbe Ihrer Seitenleiste an:

    st.markdown("""
      <style>
        [data-testid=stSidebar] {
          background-color: #94d3e6;
        }
      </style>
    """, unsafe_allow_html=True)
    
    Copy
  • Fügen Sie mit streamlit-extras ein App-Logo hinzu:

    Stellen Sie sicher, dass Sie das Paket streamlit-extras installieren, bevor Sie es ausführen.

    from streamlit_extras.app_logo import add_logo
    add_logo("./Logo.png", height=60)
    
    Copy
  • Legen Sie die Breite der Seitenleiste programmatisch fest:

    import streamlit.components.v1 as components
    
    components.html("""
      <script>
        window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px";
      </script>
    """, height=0)
    
    Copy
  • Erstellen Sie eine explorative In-BrowserDataFrame-Datenanalyse (EDA) mit ydata-profiling:

    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

Externer Zugriff auf das Netzwerk in Streamlit in Snowflake

Sie können einen sicheren Zugriff auf bestimmte Netzwerkstandorte außerhalb von Snowflake erstellen und diesen Zugriff über den Code der Streamlit-App nutzen. Sie können den Zugriff über eine externe Zugriffsintegration ermöglichen.

Um einer Streamlit-Anwendung die Verwendung einer externen Integration zu ermöglichen, können Sie den Befehl CREATE STREAMLIT oder ALTER STREAMLIT ausführen und den Parameter EXTERNAL_ACCESS_INTEGRATIONS so einstellen, dass diese Integration einbezogen wird.

Mit einer Integration für den externen Zugriff können Sie Python-Bibliotheken verwenden, die auf externe Speicherorte zugreifen, z. B. requests oder urllib, und Bibliotheken von Drittanbietern nutzen, die den Zugriff auf einen Netzwerkort erfordern.

Weitere Informationen dazu finden Sie unter Übersicht über externen Netzwerkzugriff.

Beispiel: Zugriff auf die OpenAI API

Das folgende Beispiel zeigt, wie Sie eine externe Zugriffsintegration für eine ausgehende Anfrage an die OpenAI API erstellen. Dieses Beispiel umfasst die Einstellung der Sicherheitsintegration und die Gewährung der erforderlichen Berechtigungen.

  1. Um eine Netzwerkregel zu erstellen, die den Speicherort des externen Netzwerks und die Zugriffsbeschränkungen darstellt, verwenden Sie den CREATE NETWORK RULE-Befehl, wie im folgenden Beispiel gezeigt:

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

    Weitere Informationen dazu finden Sie unter Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts.

  2. Um ein Geheimnis zu erstellen, das die Anmeldeinformationen darstellt, die für die Authentifizierung mit dem externen Speicherort des Netzwerks erforderlich sind, verwenden Sie den CREATE SECRET-Befehl, wie im folgenden Beispiel gezeigt:

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

    Weitere Informationen dazu finden Sie unter Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen.

  3. Um eine externe Zugriffsintegration zu erstellen, führen Sie den CREATE EXTERNAL ACCESS INTEGRATION-Befehl aus und setzen ALLOWED_NETWORK_RULES auf die von Ihnen erstellte Netzwerkregel und ALLOWED_AUTHENTICATION_SECRETS auf das von Ihnen erstellte Geheimnis:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int
      ALLOWED_NETWORK_RULES = (network_rules)
      ALLOWED_AUTHENTICATION_SECRETS = (openai_key)
      ENABLED = TRUE;
    
    Copy
  4. Um dem Ersteller der Streamlit-App die erforderlichen Berechtigungen zur Verwendung der Objekte SECRET und INTEGRATION für den externen Zugriff zu gewähren, verwenden Sie den GRANT <Berechtigungen>-Befehl, wie im folgenden Beispiel gezeigt:

    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. Damit die Streamlit-App die Integration nutzen kann, führen Sie den Befehl ALTER STREAMLIT aus und stellen die EXTERNAL_ACCESS_INTEGRATIONS-Eigenschaft auf die Integration ein, wie im folgenden Beispiel gezeigt:

    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

    Bemerkung

    Sie können ein neues Streamlit-Objekt auch so einrichten, dass es eine externe Zugriffsintegration verwendet, indem Sie den EXTERNAL_ACCESS_INTEGRATIONS-Parameter angeben, wenn Sie den CREATE STREAMLIT-Befehl ausführen, wie im folgenden Beispiel gezeigt:

    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. Rufen Sie im Code Ihrer Streamlit-App die externe API auf, wie im folgenden Beispiel gezeigt:

    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

Benutzerdefinierter Sleep-Timer für eine Streamlit-App

Sie können einen benutzerdefinierten Sleep-Timer für das automatische Anhalten einer Streamlit-App einstellen. Um den kundenspezifischen Sleep-Timer einzustellen, erstellen Sie in dem Pfad, der durch den Parameter ROOT_LOCATION des STREAMLIT-Objekts angegeben wird, im Ordner .streamlit eine Konfigurationsdatei config.toml.

Wenn Sie beispielsweise möchten, dass die Streamlit-App nach 8 Minuten automatisch angehalten wird, fügen Sie Folgendes zur config.toml-Datei hinzu:

[snowflake]
[snowflake.sleep]
streamlitSleepTimeoutMinutes = 8
Copy

Laden Sie die Datei config.toml in den Speicherort des Stagingbereichs hoch, wie im folgenden Beispiel gezeigt:

PUT file:///<path_to_your_root_folder>/my_app/config.toml @streamlit_db.streamlit_schema.streamlit_stage/.streamlit/ overwrite=true auto_compress=false;
Copy

Weitere Informationen zur Verwendung von Streamlit-Dateien finden Sie unter Streamlit-Apps mit SQL erstellen und bereitstellen.

Bemerkung

Sie können streamlitSleepTimeoutMinutes auf einen beliebigen Wert zwischen 5 und 240 Minuten einstellen.

Wenn Sie die Konfigurationsdatei nicht erstellen, um den Timer festzulegen, beträgt die Standardzeit für das automatische Anhalten 15 Minuten.

Kontextfunktionen und Zeilenzugriffsrichtlinien in Streamlit in Snowflake

Um Kontextfunktionen, wie z.B. CURRENT_USER, und Daten aus Tabellen mit Zeilenzugriffsrichtlinien in einer Streamlit in Snowflake-App zu verwenden, muss ein Benutzer mit der Rolle ACCOUNTADMIN der Eigentümerrolle der Streamlit-App die globale READ SESSION-Berechtigung erteilen, wie im folgenden Beispiel gezeigt:

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Copy

Bemerkung

In einer Streamlit in Snowflake-App können Sie keine Zeilenzugriffsrichtlinien verwenden, die CURRENT_ROLE verwenden. Streamlit in Snowflake-Apps werden mit den Rechten des Eigentümers ausgeführt, so dass die Verwendung von CURRENT_ROLE innerhalb einer Streamlit-App immer die Rolle des Eigentümers der App zurückgibt. Weitere Informationen dazu finden Sie unter Erläuterungen zu Eigentümerrechten und Streamlit in Snowflake-Apps.

Beispiel: Zugriff auf Daten in einer Tabelle mit Zeilenzugriffsrichtlinie mit CURRENT_USER

Sie können eine Streamlit in Snowflake-App verwenden, um den Zugriff auf Zeilen in einer Tabelle zu regeln, die durch eine Zeilenzugriffsrichtlinie geschützt ist. Geben Sie die Funktion CURRENT_USER im Body der Zeilenzugriffsrichtlinie an und fügen Sie die Zeilenzugriffsrichtlinie der Tabelle hinzu.

Das folgende Beispiel zeigt, wie Sie den Zugriff auf eine Tabelle regeln, die durch eine Zeilenzugriffsrichtlinie auf Zeilen in einer Streamlit in Snowflake-App geschützt ist.

  1. Erstellen Sie eine Tabelle, und fügen Sie Daten ein:

    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. Erstellen Sie eine Zeilenzugriffsrichtlinie:

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. Fügen Sie die Zeilenzugriffsrichtlinie der Tabelle hinzu:

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. Erstellen einer Streamlit-App

  5. Weisen Sie die globale READ SESSION-Berechtigung der Rolle des Eigentümers der Streamlit-App zu:

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. Fügen Sie den folgenden Code in Ihre Streamlit-App ein:

    # 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