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:
Benutzerdefiniertes HTML und CSS unter Verwendung von
unsafe_allow_html=True
in st.markdown.Iframed HTML, CSS und JavaScript mit st.components.v1.html.
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)
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)
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)
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)
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.
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');
Weitere Informationen dazu finden Sie unter Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts.
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>';
Weitere Informationen dazu finden Sie unter Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen.
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;
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;
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);
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);
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 # ...
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
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;
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;
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.
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');
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();
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);
Erstellen einer Streamlit-App
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;
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)