6 · Streamlit: el modelo de re-ejecución del script
Streamlit convierte un script de Python simple en una app interactiva — sin HTML, sin rutas, sin callbacks. Su gran idea es el modelo de re-ejecución: cada vez que un usuario toca un widget, Streamlit re-ejecuta TODO tu script de arriba a abajo, y los widgets simplemente devuelven sus valores actuales como variables de Python normales.
Streamlit NO tiene rutas ni manejadores de petición — corre todo tu script DE ARRIBA A ABAJO y, en CADA interacción con un widget, RE-EJECUTA el script entero desde el inicio. Un widget como `st.slider(...)` tanto DIBUJA el control COMO devuelve su valor actual como una variable de Python simple, así que tu código se lee como un script lineal mientras la página sigue interactiva. Lo lanzas con `streamlit run app.py`.
Sin esto:
Sin entender el modelo de re-ejecución, el código de Streamlit parece magia que no debería funcionar — buscarías rutas y callbacks al estilo Flask que Streamlit no tiene, y malinterpretarías por qué una variable 'se actualiza' al mover un slider.
Flask te hizo pensar en rutas y manejadores: llega una petición, corre una función específica, sale una respuesta. Streamlit tira todo eso a la basura. No hay rutas, ni objeto request, ni callbacks, ni HTML que escribir. Escribes un script de Python simple de arriba a abajo, y Streamlit lo convierte en una app web viva. El precio de esa simplicidad es aprender un nuevo modelo mental — y no se parece a nada en Flask.
El modelo de re-ejecución: todo el script corre de nuevo en cada interacción. Esta es la idea que hace que Streamlit encaje. Cuando la página carga por primera vez, Streamlit corre tu script desde la primera línea hasta la última, y cada llamada st.* pinta algo en la página. Luego — aquí está el giro — cada vez que el usuario toca cualquier widget (arrastra un slider, elige de un desplegable, hace clic en un botón), Streamlit re-ejecuta todo tu script desde el inicio otra vez, de principio a fin. No una función; el archivo completo. La página que ves es siempre el resultado de la corrida completa más reciente.
Los widgets hacen dos cosas a la vez. Una llamada de widget como age = st.slider("Edad", 0, 100, 25) es engañosamente poderosa: tanto dibuja el slider en la página como devuelve el valor actual del slider en age. En la primera corrida age es el valor por defecto (25); después de que el usuario arrastra el slider a 40 y el script se re-ejecuta, esa misma línea ahora devuelve 40. Así que lees la entrada de un widget simplemente asignando la llamada del widget a una variable — sin manejadores de eventos, sin request.form. Los widgets centrales que usarás constantemente:
st.title(...)/st.header(...)/st.write(...)— muestran texto, datos, casi cualquier cosa.st.slider(label, min, max, default)— un slider numérico, devuelve el número elegido.st.selectbox(label, options)— un desplegable, devuelve la opción elegida.st.number_input(label)/st.text_input(label)— entrada numérica / de texto escrita.st.button(label)— devuelveTruesolo en la corrida disparada por el clic,Falseel resto del tiempo.
Por qué esto es tan productivo. Como el script es lineal, construyes una UI solo escribiendo Python en orden: lee un slider, haz un cálculo, muestra el resultado — de arriba a abajo, como un notebook que resulta ser interactivo. No hay lenguaje de plantillas ni cableado de entradas a salidas; el bucle de re-ejecución lo hace por ti.
Córrelo desde la terminal. No haces python app.py a una app de Streamlit — la lanzas con streamlit run app.py, que arranca el servidor de Streamlit y abre la app en tu navegador (típicamente http://localhost:8501).
La celda de solo-lectura muestra una app de Streamlit diminuta pero completa; la segunda celda es el único comando que la corre.
Una app de Streamlit mínima: un script lineal de arriba a abajo donde cada widget `st.slider`/`st.selectbox`/`st.number_input` tanto dibuja un control como devuelve su valor actual — y Streamlit re-ejecuta todo el script en cada interacción.
Instala Streamlit y lánzalo con `streamlit run app.py` (no `python app.py`) — la app abre en `http://localhost:8501` y re-ejecuta el script en cada interacción.
En una app de Streamlit, un usuario arrastra un `st.slider` de 12 a 40. ¿Qué hace Streamlit en respuesta?
- Streamlit no tiene rutas ni manejadores: escribes un script de Python lineal de arriba a abajo, y `streamlit run app.py` lo convierte en una app web viva.
- El modelo de re-ejecución: cada interacción con un widget re-ejecuta el script ENTERO desde el inicio — esa re-ejecución es cómo se actualiza la página, por eso no hay callbacks.
- Una llamada de widget tanto dibuja el control como devuelve su valor actual: `x = st.slider(...)` pinta un slider Y asigna su valor a `x` en cada corrida.
Streamlit es la forma más rápida de poner un modelo frente a un humano — unos pocos widgets `st.*` leen características, y una sola línea `model.predict` muestra una predicción viva, sin código de frontend.
Si lo quitas: Sin entender el modelo de re-ejecución, leerías mal el código de Streamlit como roto o mágico y nunca construirías los paneles interactivos que hacen un modelo explorable para quienes no programan.