Um problema comum com aplicativos Python é como compartilhá-los com outras pessoas. Os desenvolvedores frequentemente usam uma interface web para resolver esse problema, apresentando a funcionalidade do aplicativo por meio de uma UI. Mas essa solução funciona melhor quando a interface do usuário do aplicativo se adapta naturalmente aos componentes da web. Os aplicativos de exploração de dados podem funcionar assim, por exemplo, mas também exigem componentes front-end escritos em JavaScript para interatividade ideal.
Streamlit é uma biblioteca Python que visa resolver muitos desses problemas de uma só vez. Usando o Streamlit, os desenvolvedores podem criar aplicativos Python com front-ends baseados na Web, construídos a partir de uma rica biblioteca de componentes interativos.
O aplicativo resultante pode ser hospedado em qualquer lugar onde um aplicativo da web Python resida. O melhor de tudo é que o desenvolvedor não precisa saber HTML, JavaScript ou CSS para obter bons resultados; eles só precisam escrever código em Python que use os métodos e classes do Streamlit.
Um exemplo simples de Streamlit
Os programas Streamlit são escritos em um declarativo estilo. Os objetos aparecem na página da web na ordem em que você os declara em seu código. Qualquer interação com os componentes faz com que o programa seja executado novamente de cima para baixo, recarregando a página da web para refletir as alterações feitas.
Aqui está um exemplo simples de aplicativo Streamlit:
import streamlit as st
st.title("Take input from the user")
user_input = st.text_input("Say something:")
if user_input:
st.write("You said:", user_input)
Aqui está o que acontece se você executar este código com Streamlit (usando o streamlit run
comando):
- Uma página da web aparece com o título
Take input from the user
. - Uma caixa de texto com o rótulo
Say something:
aparece abaixo disso. - Se o usuário digitar algo na caixa de texto e pressionar Enter, a entrada do usuário aparecerá abaixo da caixa de texto com o rótulo
You said:
.
Esses widgets HTML e todos os seus comportamentos são gerados e gerenciados automaticamente pelo Streamlit. Isso inclui o estado do aplicativo — no user_input
caixa, por exemplo, o if
instrução só é acionada quando o usuário insere algo.
Muitos mais componentes HTML estão disponíveis no Streamlit do que nos exemplos mostrados aqui. Componentes como texto formatado em LaTeX, gráficos Bokeh, entrada de câmera e muitos mais estão disponíveis nativamente.
Um exemplo Streamlit mais complexo
Para um aplicativo Streamlit mais complexo, dê uma olhada neste exemplo na documentação do Streamlit. Este aplicativo carrega um conjunto de dados comum de embarques e desembarques do Uber em Manhattan, agrupados por hora. Em seguida, ele plota os horários em um gráfico de barras e os locais em um mapa interativo.
O programa inteiro tem apenas cerca de 30 linhas; é curto o suficiente para que você possa copiá-lo e colá-lo em um arquivo e executá-lo você mesmo. Também é útil como uma vitrine de como o Streamlit faz muitas coisas.
Dados em aplicativos Streamlit
Streamlit oferece muitos comportamentos nativos para facilitar o manuseio de fontes de dados. Ele usa dataframes como formato principal para carregar e trabalhar com dados.
Você também pode carregar dados de qualquer fonte que usaria em qualquer outro aplicativo Python, e o Streamlit oferece conveniências para auxiliar no processo. Por exemplo, o aplicativo de visualização de dados da seção anterior usa Pandas para carregar um arquivo CSV de uma URL remota e traduzi-lo em um dataframe. Embora seja conveniente, carregar e formatar os dados pode ser lento e demorado, especialmente se você estiver carregando por meio de uma conexão de rede. O programa também recarrega após cada ação realizada pelo usuário.
Para custear isso, Streamlit fornece o @st.cache_data
decorador, usado para embrulhar o load_data()
função. Adicionalmente, @st.cache_data
armazena em cache os dados em várias recargas do aplicativo, portanto, eles só são carregados na primeira inicialização.
Gerenciamento de estado em aplicativos Streamlit
Como o design do Streamlit força o recarregamento do aplicativo a cada interação do usuário, manter o estado persistente em um aplicativo Streamlit nem sempre é óbvio. Vimos como os dados em uma caixa de texto tratam o estado entre as execuções. Mas se quisermos criar e gerenciar estados separados do estado de controles individuais, precisamos usar o objeto session_state integrado do Streamlit.
streamlit.session_state
é um armazenamento de valores-chave – essencialmente um dicionário – que persiste durante as execuções. Quando um programa Streamlit é iniciado pela primeira vez, esse armazenamento fica vazio, então você precisa testar a presença de chaves antes de tentar acessá-las.
import streamlit as st
# create the key "sayings" if it doesn't exist
if 'sayings' not in st.session_state:
st.session_state('sayings') = ()
# for convenience, make a reference
sayings = st.session_state('sayings')
st.title("Take input from the user")
user_input = st.text_input("Say something:")
if sayings:
# display "sayings" if it has inputs from previous runs
st.write("You previously said:", sayings)
if user_input:
# add to "sayings" if we get an input
sayings.append(user_input)
st.write("You said:", user_input)
Observe que quaisquer dados armazenados em session_state
persiste apenas durante a vida útil do servidor Streamlit que executa o aplicativo. Se o servidor parar, os dados serão perdidos. Se precisar de dados que persistam de forma mais agressiva, você pode precisar de uma solução como um banco de dados ou um cache na memória como o Redis.
Widgets de dados para aplicativos Streamlit
Vimos como os elementos nas páginas Streamlit podem variar de simples rótulos de texto ou controles HTML a elementos mais elaborados, como mapas, gráficos, reprodução de áudio/vídeo ou interações avançadas, como caixas de bate-papo (por exemplo, para interagir com LLMs).
Os controles Streamlit para exibir ou interagir com dados já estão pré-configurados para lidar com a renderização de dados para os casos de uso mais comuns. Por exemplo, os widgets da web Streamlit podem usar dataframes como fonte e apresentar automaticamente dataframes com rotulagem de coluna adequada para que você não precise adicioná-los manualmente.
Uma ampla biblioteca de widgets de dados comuns está incluída no Streamlit por padrão. Mais desses componentes, criados e compartilhados pela comunidade de usuários, estão disponíveis por meio de um simples pip install
.
Implantando aplicativos Streamlit
Como os aplicativos Streamlit são, em essência, aplicativos Web Python, eles podem ser implantados da mesma maneira que qualquer aplicativo Python em rede. A maneira rápida e suja é simplesmente executar o aplicativo em uma determinada máquina e fornecer acesso a ele por meio da porta atribuída.
Implantações mais avançadas também seguem o mesmo padrão de outros aplicativos web Python – usando Docker, Kubernetes ou vários serviços de nuvem comuns. Os usuários do Snowflake na AWS e no Microsoft Azure também podem implantar aplicativos Streamlit apoiados pelo armazenamento de dados do Snowflake. Finalmente, Streamlit fornece seu próprio serviço de hospedagem Community Cloud, embora isso seja uma conveniência e não obrigatório para aplicativos Streamlit.