Módulo: Estado de sesión, formularios y caché
Este módulo forma parte del curso de Streamlit. .
Comprender cómo Streamlit gestiona el estado y el rendimiento es esencial para construir aplicaciones robustas y eficientes. Este módulo cubre los mecanismos fundamentales: st.session_state para persistir datos entre reruns, st.form para agrupar entradas, st.fragment para reruns parciales y los decoradores de caché @st.cache_data y @st.cache_resource.
st.session_state: persistencia entre reruns
Por defecto, cada rerun reinicia todas las variables Python. st.session_state es un diccionario mutable que persiste entre reruns:
import streamlit as st
if "contador" not in st.session_state:
st.session_state.contador = 0
if st.button("Incrementar"):
st.session_state.contador += 1
st.write(f"Contador: {st.session_state.contador}")
Callbacks: on_change y on_click
Los callbacks permiten ejecutar lógica cuando un widget cambia, antes de que se re-ejecute el script:
def actualizar_total():
st.session_state.total = st.session_state.precio * st.session_state.cantidad
precio = st.number_input("Precio", key="precio", on_change=actualizar_total)
cantidad = st.number_input("Cantidad", key="cantidad", on_change=actualizar_total)
st.metric("Total", f"€ {st.session_state.get('total', 0):.2f}")
st.form: envío por lotes
Los formularios agrupan varios widgets y los envían todos de una vez, evitando reruns intermedios:
with st.form("filtros"):
fecha_inicio = st.date_input("Desde")
fecha_fin = st.date_input("Hasta")
categoria = st.selectbox("Categoría", ["Todas", "A", "B", "C"])
enviado = st.form_submit_button("Aplicar filtros")
if enviado:
st.success(f"Filtros aplicados: {fecha_inicio} — {fecha_fin}, {categoria}")
st.fragment: reruns parciales
@st.fragment marca una función cuyo cuerpo se re-ejecuta de forma independiente, sin volver a ejecutar el script completo:
@st.fragment(run_every="5s") # Actualización automática cada 5 segundos
def mostrar_metricas_tiempo_real():
df = obtener_datos_recientes()
st.line_chart(df)
mostrar_metricas_tiempo_real()
@st.cache_data y @st.cache_resource
@st.cache_data(ttl=3600) # Caché de 1 hora
def cargar_dataset(url: str) -> pd.DataFrame:
return pd.read_csv(url)
@st.cache_resource # Singleton: conexión a BD, modelo ML cargado
def cargar_modelo():
import joblib
return joblib.load("modelo.pkl")
df = cargar_dataset("https://datos.ejemplo.com/ventas.csv")
modelo = cargar_modelo()
@st.cache_data serializa el resultado (adecuado para DataFrames y valores serializables). @st.cache_resource almacena el objeto en memoria sin serializar (adecuado para conexiones de BD, modelos de ML y recursos pesados).
Otros módulos de este curso
Estado de sesión, formularios y caché
Todos los módulos del curso
Navega entre los módulos de Streamlit
Estado de sesión, formularios y caché
Estás aquíExplora más sobre Streamlit
Descubre más recursos de Streamlit
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Streamlit es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.