Streamlit是专为数据科学设计的脚本即应用工具,无需路由和前后端通信,只需一个Python脚本加streamlit run app.py即可生成交互网页;其核心执行模型为全脚本重运行,依赖控件值触发预测逻辑,并需用@st.cache_resource、st.session_state等机制管理状态与资源。

Streamlit 不是用来“替代” Flask 的通用 Web 框架,而是专为数据科学场景设计的脚本即应用工具。你不需要写路由、不处理请求/响应、也不用配前后端通信——只要把模型加载、预测逻辑和界面控件写进一个 Python 脚本,streamlit run app.py 就能立刻跑出可交互的网页。
怎么让模型输入输出在网页里实时跑起来?
核心是把模型预测封装成函数,并用 st.button 或控件变化自动触发。不要手动监听事件或写回调。
-
st.number_input、st.slider、st.selectbox这些控件返回的是当前值,不是“绑定变量”,每次脚本重执行都会拿到最新值 - 把模型预测逻辑放在控件之后、且不在
if st.button(...)外部裸跑,否则每次滑动都会重复预测(浪费资源) - 示例:用户调参后点“预测”,才执行
model.predict(X),而不是每次改 slider 就 predict 一次
import streamlit as st
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
<p>X, y = make_classification(n_samples=100, n_features=4, random_state=42)
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)</p><p>st.title("模型预测 Demo")
n_est = st.slider("树的数量", min_value=10, max_value=200, value=100)
st.write(f"当前参数:{n_est}")</p><p>if st.button("重新训练并预测"):
model = RandomForestClassifier(n_estimators=n_est)
model.fit(X, y)
pred = model.predict(X[:1])
st.write(f"首条样本预测结果:{pred[0]}")为什么选中的数据集或模型没生效?
常见错误是把数据加载或模型初始化写在控件定义之前,导致它们只在启动时执行一次,后续切换不刷新。
- 所有依赖用户选择的逻辑(如
get_dataset(name)、load_model(type))必须放在控件调用之后 - 避免全局变量缓存旧数据;用
@st.cache_resource缓存模型,用@st.cache_data缓存数据集(注意:带参数的函数要加hash_funcs或确保参数可哈希) - 如果用了
st.session_state记状态,记得在控件变化时主动更新,比如st.session_state['dataset'] = dataset_name
部署前必须检查的三件事
本地能跑 ≠ 打包或部署后能跑。最容易翻车的是路径、依赖和模型序列化格式。
立即学习“Python免费学习笔记(深入)”;
- 读取数据或模型文件时,别用相对路径如
"model.pkl",改用os.path.join(os.path.dirname(__file__), "model.pkl") -
requirements.txt必须显式列出scikit-learn==1.4.2这类带版本号的依赖,不同大版本间joblib.load()可能报ModuleNotFoundError - 模型保存推荐用
joblib(比pickle更兼容),但别用 Python 3.11+ 保存再用 3.9 加载——版本错配会直接AttributeError: 'NoneType' object has no attribute 'decode'
真正的难点不在代码量,而在于理解 Streamlit 的执行模型:它不是常驻服务,而是每次交互都重跑整个脚本。所有“状态”都得靠 @st.cache_*、st.session_state 或外部存储来维持——漏掉这点,界面看起来就“不响应”或“回退”。


















