Recursos adicionais do Streamlit in Snowflake¶
Este tópico descreve os recursos adicionais do Streamlit in Snowflake.
UI personalizada no Streamlit in Snowflake¶
A UI personalizada permite a customização da aparência e do comportamento, bem como de funcionalidades front-end dos aplicativos Streamlit in Snowflake. Este recurso oferece suporte ao seguinte:
HTML e CSS personalizados usando
unsafe_allow_html=True
em st.markdown.HTML com iframe, CSS e JavaScript usando st.components.v1.html.
Nota
A UI personalizada possui algumas restrições relacionadas à Política de segurança de conteúdo (CSP). Para obter mais informações, consulte Limitações ao carregar recursos externos no Streamlit in Snowflake.
Para começar a personalizar seu aplicativo Streamlit in Snowflake, basta chamar st.components.v1.html
ou st.markdown
com unsafe_allow_html=True
. O HTML fornecido é adicionado ao front-end do aplicativo no navegador do usuário.
Nota
Você deve especificar o HTML em linha ou carregar o HTML em uma cadeia de caracteres. Você não pode passar um URL ou um caminho de arquivo diretamente para o comando a ser executado ou incorporado.
Consulte os seguintes exemplos para personalizar seus aplicativos Streamlit in Snowflake:
Personalize a cor de fundo da barra lateral:
st.markdown(""" <style> [data-testid=stSidebar] { background-color: #94d3e6; } </style> """, unsafe_allow_html=True)
Adicione um logotipo de aplicativo com
streamlit-extras
:Certifique-se de instalar o pacote
streamlit-extras
antes de executar.from streamlit_extras.app_logo import add_logo add_logo("./Logo.png", height=60)
Defina a largura da barra lateral programaticamente:
import streamlit.components.v1 as components components.html(""" <script> window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px"; </script> """, height=0)
Crie uma análise de dados exploratória de DataFrame no navegador (EDA) com
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)
Acesso à rede externa no Streamlit in Snowflake¶
É possível criar acesso seguro a locais de rede específicos externos ao Snowflake e usar esse acesso de dentro do código do aplicativo Streamlit. É possível habilitar o acesso por meio de uma integração de acesso externo.
Para permitir que um aplicativo Streamlit use uma integração de acesso externo, você pode executar o comando CREATE STREAMLIT ou ALTER STREAMLIT e definir o parâmetro EXTERNAL_ACCESS_INTEGRATIONS para incluir essa integração.
Com uma integração de acesso externo, você pode usar bibliotecas Python que acessam locais externos, como requests
ou urllib
, e usar bibliotecas de terceiros que exigem acesso a um local de rede.
Para obter mais informações, consulte Visão geral do acesso à rede externa.
Exemplo: Acesse a API OpenAI¶
O exemplo a seguir mostra como criar uma integração de acesso externo para uma solicitação de saída para a API OpenAI. Este exemplo inclui a configuração da integração de segurança e a concessão dos privilégios necessários.
Para criar uma regra de rede que represente o local da rede externa e as restrições de acesso, use o comando CREATE NETWORK RULE conforme mostrado no exemplo a seguir:
CREATE OR REPLACE NETWORK RULE network_rules MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('api.openai.com');
Para obter mais informações, consulte Criação de uma regra de rede para representar o local da rede externa.
Para criar um segredo que represente as credenciais necessárias para autenticação com o local de rede externa, use o comando CREATE SECRET, conforme mostrado no exemplo a seguir:
CREATE OR REPLACE SECRET openai_key TYPE = GENERIC_STRING SECRET_STRING = '<any_string>';
Para obter mais informações, consulte Criação de um segredo para representar credenciais.
Para criar uma integração de acesso externo, execute o comando CREATE EXTERNAL ACCESS INTEGRATION, configuração ALLOWED_NETWORK_RULES como a regra de rede que você criou e ALLOWED_AUTHENTICATION_SECRETS como o segredo que você criou:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int ALLOWED_NETWORK_RULES = (network_rules) ALLOWED_AUTHENTICATION_SECRETS = (openai_key) ENABLED = TRUE;
Para conceder os privilégios necessários para usar os objetos SECRET e INTEGRATION para acesso externo ao criador do aplicativo Streamlit, use o comando GRANT <privilégios>, conforme mostrado no exemplo a seguir:
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;
Para permitir que o aplicativo Streamlit use a integração, execute o comando ALTER STREAMLIT, configurando a propriedade EXTERNAL_ACCESS_INTEGRATIONS para a integração, conforme mostrado no exemplo a seguir:
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);
Nota
Você também pode definir um novo objeto Streamlit para usar uma integração de acesso externo especificando o parâmetro EXTERNAL_ACCESS_INTEGRATIONS ao executar o comando CREATE STREAMLIT, conforme mostrado no exemplo a seguir:
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);
No código do aplicativo Streamlit, chame a API externa, conforme mostrado no exemplo a seguir:
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 # ...
Temporizador de sono personalizado para um aplicativo Streamlit¶
Você pode definir um temporizador personalizado para um aplicativo Streamlit suspender automaticamente. Para definir o temporizador de sono personalizado, crie um arquivo de configuração config.toml
dentro da pasta .streamlit
no caminho especificado pelo parâmetro ROOT_LOCATION
do objeto STREAMLIT.
Por exemplo, se você quiser que o aplicativo Streamlit seja suspenso automaticamente após 8 minutos, adicione o seguinte ao arquivo config.toml
:
[snowflake]
[snowflake.sleep]
streamlitSleepTimeoutMinutes = 8
Carregue o arquivo config.toml
no local do estágio, conforme mostrado no exemplo a seguir:
PUT file:///<path_to_your_root_folder>/my_app/config.toml @streamlit_db.streamlit_schema.streamlit_stage/.streamlit/ overwrite=true auto_compress=false;
Para obter mais informações sobre como trabalhar com arquivos Streamlit, consulte Criação e implementação de aplicativos Streamlit usando SQL.
Nota
Você pode definir o streamlitSleepTimeoutMinutes
para qualquer valor entre 5 a 240 minutos.
Se você não criar o arquivo de configuração para especificar o temporizador, o tempo padrão de suspensão automática será de 15 minutos.
Funções de contexto e políticas de acesso a linhas no Streamlit in Snowflake¶
Para usar funções de contexto, como CURRENT_USER e dados de tabelas com políticas de acesso a linhas em um aplicativo Streamlit in Snowflake, um usuário com a função ACCOUNTADMIN deve conceder o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit, conforme mostrado no exemplo a seguir:
USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Nota
Em um aplicativo Streamlit in Snowflake, é possível usar políticas de acesso a linhas que usam CURRENT_ROLE. Os aplicativos Streamlit in Snowflake são executados com direitos de proprietário, portanto, usar CURRENT_ROLE dentro de um aplicativo Streamlit sempre retorna a função de proprietário do aplicativo. Para obter mais informações, consulte Noções básicas sobre os direitos do proprietário e aplicativos Streamlit in Snowflake.
Exemplo: Como acessar dados em uma tabela com a política de acesso a linhas usando CURRENT_USER¶
É possível usar um aplicativo Streamlit in Snowflake para controlar o acesso a linhas em uma tabela protegida por uma política de acesso a linhas. Especifique a função CURRENT_USER no corpo da política de acesso a linhas e adicione a política de acesso a linhas à tabela.
O exemplo a seguir demonstra como controlar o acesso a uma tabela protegida por uma política de acesso a linhas em um aplicativo Streamlit in Snowflake.
Criar uma tabela e inserir dados:
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');
Crie uma política de acesso a linhas:
CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy AS (the_owner VARCHAR) RETURNS BOOLEAN -> the_owner = CURRENT_USER();
Adicione a política de acesso a linhas à tabela:
ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
Criar um aplicativo Streamlit.
Conceda o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit:
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Adicione o seguinte código ao seu aplicativo 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)