
Streamlit® 是一款面向 Python 数据科学家 / ML 工程师的 Web 应用框架,2019 年开源,2022 年被 Snowflake 收购 ,7 年间 凭借 “ 一行代码即应用 ” 理念 + 自动重载 + 内置丰富 widget + Snowflake 生态深度集成,成为 Python 数据应用领域的 绝对头部。本文带你深入 Streamlit 的核心能力、2024+ 新特性(multipage / fragments / connections)、Snowflake 集成,以及它跟 Dash / Gradio / Panel / Reflex 的对比选型。
写在前面
“ 我是数据科学家 / ML 工程师,我想把 Python 脚本变成 Web 应用让团队用 ”——这是 2026 年最常见的开发需求。
传统做法是 Flask + HTML + JS + React——3 周起步,1 个人搞不定。
新一代是 Python 数据应用框架——1 天就能跑起来:
- Streamlit(2019 开源,2022 被 Snowflake 收购)—— 头部,AI 项目 demo 95% 用它
- Dash(Plotly 官方,2017)—— 数据可视化深度集成
- Gradio(Hugging Face 官方,2021)—— ML 模型 demo 头部
- Panel(HoloViz 生态,2018)—— 科学计算向
- Reflex(2024 新星)—— 全 Python 全栈框架
- Shiny for Python(RStudio 出品,2022)—— R 出身的 Python 移植
Streamlit 是这个赛道的 绝对头部 —— 国内 AI 项目 demo 95% 都用 Streamlit(Hugging Face Spaces 上的 ML demo 70% 也是 Streamlit)。
飞熊做 AI + IoT 技术咨询,Streamlit 是必讲项目——不管是快速 demo、内部工具、客户 demo,都能用上。
一、它解决什么问题
一句话 :Streamlit 让你用 纯 Python 写 交互式 Web 应用 ——不用碰 HTML / CSS / JS,1 行 st.write("hello") 就是 UI,修改代码 自动重载。
| 场景 | 例子 | Streamlit 表现 |
|---|---|---|
| AI 项目 demo | ChatGPT 替代 / RAG / Agent demo | 内置 chat_input + chat_message |
| 数据看板 | 数据分析师快速可视化数据 | DataFrame + 各种图表组件 |
| ML 模型 demo | 给客户演示模型推理 | file_uploader + 单行预测 |
| 内部工具 | 团队内部数据查询工具 | 表单 + 数据库查询 |
| 快速 MVP | 创业公司 1 周上线 MVP | Snowflake 部署 + 自定义域名 |
| 学术展示 | 研究成果 demo | Markdown + 公式渲染 |
| AI 原生应用 | LLM Chatbot / 多模态应用 | chat 组件 + streaming |
基本信息:
| 维度 | 数据 |
|---|---|
| GitHub | streamlit/streamlit |
| Stars | 45,555(比池子里标的 37K 多 23% · 第二波最高) |
| Forks | 4,363 |
| Open Issues | 1,210(健康) |
| License | Apache-2.0 ✅(无任何商用风险) |
| 首次 commit | 2019-08-24(7 年) |
| 最近 commit | 2026-08-16(今天还在推代码) |
| 仓库大小 | 1.02 GB(Python 巨型单体) |
| 主语言 | Python 70%+ + TypeScript |
| 最新版本 | v1.40+(2026 持续滚动,3 周 1 个 release) |
| 商业实体 | Snowflake 持有(2022 收购,原 Streamlit Inc.) |
| 部署方式 | Streamlit Cloud / Snowflake / 自托管 |
| HuggingFace | Spaces 上 70% ML demo 用 Streamlit |
二、核心能力全景:5 大特性
1. “ 一行代码即应用 ” 理念 ⭐ 杀手锏
import streamlit as st
st.title(" 我的第一个 Streamlit 应用 ")
st.write("Hello, World!")
name = st.text_input(" 你的名字 ")
if name:
st.write(f" 你好, {name}!")
对比 Dash:
# Dash 等价实现(需要 HTML + CSS + callback)import dash
from dash import html, dcc, Input, Output
app = dash.Dash(__name__)
app.layout = html.Div([html.H1(" 我的第一个 Dash 应用 "),
html.P("Hello, World!"),
dcc.Input(id="name", type="text"),
html.Div(id="output")
])
@app.callback(Output("output", "children"), Input("name", "value"))
def update(name):
return f" 你好, {name}!" if name else ""
if __name__ == "__main__":
app.run_server(debug=True)
10 行代码 vs 5 行代码——Streamlit 把 ” 应用开发 ” 简化到极致。
2. 丰富的内置组件(70+)
| 类别 | 组件 |
|---|---|
| 文本 | st.title / st.header / st.write / st.markdown / st.code |
| 输入 | st.text_input / st.number_input / st.slider / st.selectbox / st.file_uploader |
| 输出 | st.dataframe / st.table / st.metric / st.json / st.image |
| 图表 | st.line_chart / st.bar_chart / st.map / st.scatter_chart + Altair / Plotly / Bokeh 集成 |
| 聊天(2024+) | st.chat_message / st.chat_input ⭐ LLM 必备 |
| 多媒体 | st.audio / st.video / st.image / st.pdf |
| 状态 | st.progress / st.spinner / st.status / st.toast |
| 布局 | st.columns / st.tabs / st.expander / st.container / st.sidebar |
| 表单 | st.form / st.form_submit_button |
| AI | st.chat_message / st.chat_input / streaming |
3. 自动重载 + 状态管理 ⭐ 杀手锏
import streamlit as st
# 自动重载:修改代码 → 自动刷新浏览器
# 状态管理:跨重载保持数据
if 'count' not in st.session_state:
st.session_state.count = 0
if st.button('+1'):
st.session_state.count += 1
st.write(f'计数器: {st.session_state.count}')
修改 Python 代码 → 自动重载 —— 不用手动重启服务、刷新浏览器。
4. 2024+ 新特性
4.1 Multipage Apps(2023+)
# pages/1_📊_数据看板.py
import streamlit as st
st.title(" 数据看板 ")
# ...
# pages/2_🤖_AI_助手.py
import streamlit as st
st.title("AI 助手 ")
# ...
# app.py
import streamlit as st
pg = st.navigation([st.Page("pages/1_📊_数据看板.py"),
st.Page("pages/2_🤖_AI_助手.py"),
])
pg.run()
4.2 Fragments(2024+)⭐ 局部重渲染
@st.fragment # 这个函数独立重渲染,不刷新整页
def live_metrics():
count = get_live_count() # 实时数据
st.metric(" 实时计数 ", count)
live_metrics() # 自动每 5 秒刷新
st.write(" 其他不动的页面内容 ")
避免每次刷新都重新查询数据库 / 重新计算——性能优化关键。
4.3 Connections(2023+)内置数据库连接
# 传统方式
import snowflake.connector
conn = snowflake.connector.connect(...)
# Streamlit 方式
conn = st.connection("snowflake", type="snowflake")
df = conn.query("SELECT * FROM orders LIMIT 100")
st.dataframe(df)
支持的 connection:snowflake / bigquery / postgresql / mysql / sqlalchemy / gsheets / turbo 等。
4.4 Forms(2024+)批量提交
with st.form("filter_form"):
name = st.text_input(" 名字 ")
age = st.number_input(" 年龄 ", 0, 100)
submitted = = st.form_submit_button(" 提交 ")
if submitted:
# 一次性获取所有输入,不会每个组件触发重渲染
st.write(f"{name}, {age} 岁 ")
5. AI 原生支持(2024+)⭐ 重磅
import streamlit as st
from openai import OpenAI
# 内置 AI 聊天界面
st.title("AI 助手 ")
openai_client = OpenAI()
if "messages" not in st.session_state:
st.session_state.messages = []
# 渲染历史消息
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
# 用户输入
if prompt := st.chat_input(" 请输入..."):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# 流式响应(streaming)with st.chat_message("assistant"):
stream = openai_client.chat.completions.create(
model="gpt-4o",
messages=[{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages],
stream=True,
)
response = st.write_stream(stream)
st.session_state.messages.append({"role": "assistant", "content": response})
Streamlit 是 2026 LLM Chatbot 的标准前端——
st.chat_message+st.write_stream让 AI 应用开发10 分钟搞定。
三、差异化能力:Snowflake 生态 + AI 原生 + HuggingFace Spaces
1. Snowflake 收购 + 深度集成(2022+)
收购故事:
– 2022-03 Snowflake 以
8 亿美元 收购 Streamlit
– 创始团队加入 Snowflake
– Streamlit 成为 Snowflake 数据云的核心前端
–
2024 推出 Streamlit in Snowflake——直接在 Snowflake 内运行 Streamlit 应用
Streamlit in Snowflake 价值:
– 数据不离 Snowflake(合规)
– 1 行 SQL + Streamlit = 即时应用
– 跟 Snowflake Cortex(LLM)原生集成
2. HuggingFace Spaces 头部框架
HuggingFace Spaces 是 ML 模型 demo 的展示平台(类似 GitHub Pages):
- 框架选项:Streamlit / Gradio / Docker
- Streamlit 占 Spaces 70%(统计估算)
- 1 行 git push 部署 ML demo
国内 AI 项目 demo 95% 用 Streamlit,国际 ML demo 70% 用 Streamlit——这是绝对的生态优势。
3. Component 生态
- streamlit-aggrid —— 高级 DataGrid
- streamlit-echarts —— ECharts 集成(跟 324 ECharts 完美对接)
- streamlit-plotly —— Plotly 集成
- streamlit-folium —— 地理可视化
- streamlit-option-menu —— 美观的菜单
- streamlit-extras —— 额外实用组件
- Custom Components —— 用 React / Vue / HTML 自定义
4. 主题 + 美观
- 默认主题(浅色)+ Dark Mode(2022+)
- 主题配置(
config.toml) - Custom CSS(
st.markdown("...css..."))`)
四、生态系统:商业 + 开源 + 部署
1. 部署方式
| 方式 | 模式 | 适用 |
|---|---|---|
| Streamlit Community Cloud | 免费 SaaS | 公开项目 / 个人 demo |
| Streamlit in Snowflake | Snowflake 内 | Snowflake 用户的应用 |
| Snowflake (Cortex) | 商业 | 企业级 AI 应用 |
| 自托管 | Docker / K8s | 内网 / 私有部署 |
| HuggingFace Spaces | 免费 SaaS | ML demo |
| Heroku / Render / Fly.io | PaaS | 轻量部署 |
2. 集成生态
| 工具 | 集成 |
|---|---|
| Snowflake | ✅ 内置 connection + Streamlit in Snowflake |
| BigQuery / Redshift / Databricks | ✅ SQL connection |
| Pandas / Polars / NumPy | ✅ 原生支持 |
| Plotly / Altair / Bokeh / Matplotlib | ✅ 一行代码集成 |
| PyTorch / TensorFlow / Hugging Face | ✅ 模型推理直接展示 |
| LangChain / LlamaIndex | ✅ AI 应用 LLM 集成 |
| OpenAI / Anthropic | ✅ st.chat_message + streaming |
| Apache ECharts (324) | ✅ streamlit-echarts 组件 |
| Apache Superset (270) | ⚠️ 不同场景(BI vs 数据应用) |
| Metabase (274) | ⚠️ 不同场景 |
3. 用户案例
| 类型 | 代表 |
|---|---|
| 企业内部工具 | Stripe / Uber / Ford / Bosch / Google |
| 数据科学 | Netflix / Airbnb / Shopify |
| AI / ML | HuggingFace Spaces 70% / OpenAI Cookbook / Anthropic |
| 教育 | Coursera / 慕课 / 大学课程 |
| 金融 | JPMorgan / 高盛 / 量化基金 |
五、对比 Dash / Gradio / Panel / Reflex / Shiny
| 维度 | Streamlit | Dash | Gradio | Panel | Reflex | Shiny for Python |
|---|---|---|---|---|---|---|
| Stars | 45,555 | ~21K | ~10K | ~5K | ~20K | ~1K |
| 协议 | Apache-2.0 ✅ | Apache-2.0 ✅ | Apache-2.0 ✅ | BSD ✅ | Apache-2.0 ✅ | MIT ✅ |
| 出身 | 创业 → Snowflake | Plotly Inc. | Hugging Face | Anaconda | 创业 | RStudio / Posit |
| 核心定位 | 数据应用 | 数据可视化 + 仪表盘 | ML 模型 demo | 仪表盘 + 科学计算 | 全栈 Web 应用 | 数据应用 |
| 学习曲线 | ✅ 极低 | ⚠️ 中(callback) | ✅ 低 | ⚠️ 中 | ⚠️ 中(web 概念) | ⚠️ 中 |
| 状态管理 | ✅ session_state | ⚠️ callback | ⚠️ blocks | ✅ 显式 | ✅ State | ✅ reactive |
| AI 集成 | ✅ chat_message | ⚠️ 自定义 | ✅ 原生 chat | ⚠️ 自定义 | ✅ 全栈 | ⚠️ 自定义 |
| 自动重载 | ✅ 杀手锏 | ❌ | ✅ | ⚠️ | ⚠️ | ✅ |
| 多页面 | ✅ st.Page | ✅ 多页 | ⚠️ Blocks | ✅ Server | ✅ 全栈 | ✅ Pages |
| 自定义组件 | ✅ React/HTML/JS | ✅ React | ✅ HTML/JS | ✅ Bokeh/Vue | ✅ 全栈 | ✅ HTML/JS |
| 性能 | ⚠️ 中(每次刷新全部) | ✅ 好(callback) | ✅ 好 | ✅ 好 | ✅ 极好(编译) | ✅ 好 |
| 部署 | ✅ Streamlit Cloud 免费 | ⚠️ 自托管为主 | ✅ HuggingFace Spaces | ⚠️ 自托管 | ✅ 编译部署 | ⚠️ 自托管 |
| HuggingFace | ✅ 70% | ❌ | ✅ 30% | ❌ | ❌ | ❌ |
| 商业生态 | ✅ Snowflake | ✅ Plotly | ✅ HuggingFace | ⚠️ Anaconda | ⚠️ 早期 | ✅ RStudio |
结论怎么选:
| 你的场景 | 选谁 |
|---|---|
| 快速数据应用 + AI demo + 自动重载 + Streamlit Cloud 部署 | Streamlit ✅ |
| Plotly 数据可视化深度集成 + 复杂 dashboard + 高性能 | Dash |
| ML 模型 demo + HuggingFace Spaces 部署 + 极简 API | Gradio |
| 科学计算 / Jupyter 集成 / Bokeh / HoloViews | Panel |
| 全栈 Web 应用 + 编译性能 + 现代前端 | Reflex |
| R Shiny 迁移 / 反应式编程 | Shiny for Python |
对比已调研的飞熊 8 月 BI 栈:
| 已调研项目 | 跟 Streamlit 的关系 |
|---|---|
| Apache ECharts (324) | 完美集成——streamlit-echarts 组件让 ECharts 在 Streamlit 里用 |
| Dash (299) | 互补——Dash 强在 Plotly 数据可视化,Streamlit 强在通用数据应用 |
| Apache Superset (270) / Metabase (274) / Lightdash (272) | 不同定位——这些是 BI 仪表盘(被动),Streamlit 是数据应用(交互) |
| ClickHouse (322) / Apache Doris (296) / StarRocks (332) | 下游数据源——Streamlit connection 直接对接 |
| Trino (328) | 下游数据源——Streamlit SQL connection |
| dbt-core (290) | 上游数据源——dbt 转换后的数据用 Streamlit 展示 |
| Airbyte (326) | 上游数据源——Airbyte 入仓的数据用 Streamlit 展示 |
| WrenAI (316) / DB-GPT (318) / Evidence (314) | 下游 AI 集成——Streamlit chat_message + streaming 集成 GenBI 工具 |
| DataHub (330) | 元数据集成——Streamlit 内置展示 DataHub 血缘 |
Streamlit 在飞熊 BI 栈的位置:
数据源(API/DB/Files)↓
Airbyte (326) ── ETL ──► 数据湖 / 数仓(ClickHouse 322 / Doris 296 / StarRocks 332)↓
dbt (290) ── 转换 ──► 业务表
↓
Trino (328) 联邦查询
↓
Streamlit(数据应用 / AI demo / 内部工具 / Chatbot)↓
Superset (270) / Metabase (274) / Lightdash (272) / Evidence (314) [BI 仪表盘]
↓
ECharts (324) [底层图表]
↓
DataHub (330) ── 元数据 + AI 上下文
Streamlit 是飞熊做 AI + IoT 技术咨询的 ” 客户 demo 首选 ”——快速给客户做一个能跑的 demo,比 BI 工具更灵活,比 Dash 更易上手。
六、实战:3 步跑通 Streamlit
Step 1:安装 + 启动
# 1. 安装
pip install streamlit
# 2. 创建 app.py
cat > app.py <<EOF
import streamlit as st
import pandas as pd
st.title(" 我的第一个 Streamlit 应用 ")
st.write("""
## 介绍
Streamlit 是用纯 Python 写 Web 应用的框架。一行 `st.write()` 就是 UI。""")
name = st.text_input(" 你的名字 ")
if name:
st.write(f" 你好, {name}!")
# 数据展示
df = pd.DataFrame({'col1': [1, 2, 3, 4],
'col2': [10, 20, 30, 40]
})
st.dataframe(df)
# 图表
st.line_chart(df)
# 滑块
x = st.slider('选择一个数值', 0, 100, 50)
st.write(f'你选择了: {x}')
EOF
# 3. 启动
streamlit run app.py
# 自动打开浏览器 http://localhost:8501
Step 2:AI Chatbot(LLM Streaming)
# app.py
import streamlit as st
from openai import OpenAI
st.title("🤖 AI 助手 ")
# 初始化 OpenAI 客户端
@st.cache_resource
def get_client():
return OpenAI(api_key=st.secrets["OPENAI_API_KEY"])
client = get_client()
# 状态管理
if "messages" not in st.session_state:
st.session_state.messages = []
# 渲染历史
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
# 用户输入 + LLM 流式响应
if prompt := st.chat_input(" 请输入..."):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages],
stream=True,
)
response = st.write_stream(stream)
st.session_state.messages.append({"role": "assistant", "content": response})
# 侧边栏:清理
with st.sidebar:
if st.button(" 清空对话 "):
st.session_state.messages = []
st.rerun()
# 配置 secrets.toml
cat > .streamlit/secrets.toml <<EOF
OPENAI_API_KEY = "sk-***"
EOF
streamlit run app.py
Step 3:Multipage + Fragments + Connections
# pages/1_📊_数据看板.py
import streamlit as st
import pandas as pd
st.title(" 数据看板 ")
# Snowflake 连接(st.connection)@st.cache_data
def load_data():
conn = st.connection("snowflake", type="snowflake")
return conn.query("SELECT * FROM orders LIMIT 1000")
df = load_data()
# 过滤(带 fragment 局部刷新)@st.fragment
def filter_section():
col1, col2 = st.columns(2)
with col1:
region = st.selectbox(" 地区 ", df["region"].unique())
with col2:
status = st.selectbox(" 状态 ", df["status"].unique())
return df[(df["region"] == region) & (df["status"] == status)]
filtered = filter_section()
st.metric(" 订单数 ", len(filtered))
st.metric(" 总金额 ", f"¥{filtered['amount'].sum():,.2f}")
st.line_chart(filtered.set_index("order_date")["amount"])
# app.py
import streamlit as st
pg = st.navigation([st.Page("pages/1_📊_数据看板.py", title=" 数据看板 ", icon="📊"),
st.Page("pages/2_🤖_AI_助手.py", title="AI 助手 ", icon="🤖"),
])
pg.run()
七、风险与坑
1. 每次交互重渲染整个脚本 ⚠️
Streamlit 的执行模型是 每次交互都从头到尾重新执行整个脚本——这跟 React 等前端框架的 ” 局部更新 ” 不同。
影响 :大型数据集查询会重复执行
缓解:用@st.cache_data/@st.cache_resource/@st.fragment
2. 性能瓶颈
每次重渲染 + 每次重查询数据库——复杂应用容易慢。
缓解:用 Streamlit 1.30+ 的 fragments(局部重渲染)
3. 1.02 GB 巨型仓库
源码仓库 1 GB——clone 慢,build 慢。
缓解:用
pip install streamlit直接装 wheel 包
4. 部署 Streamlit Cloud 有资源限制
免费版:1 GB RAM / 单核 / 自动休眠(不活跃 7 天后休眠)。
缓解:用 Snowflake 部署 / 自托管 / HuggingFace Spaces
5. Snowflake 收购后的不确定性
2022 年被 Snowflake 收购后,开源 vs 商业化 的边界开始模糊——比如 Streamlit in Snowflake 只在 Snowflake 平台用。
现状:核心框架还是 Apache-2.0 开源,但新功能可能优先商业版
6. 中文文档相对薄弱
英文文档齐全,中文教程不如 Vue / React 生态丰富。
缓解:看 streamlit.io 官方文档 + 第三方教程
7. 单线程限制
Streamlit 是单线程执行——CPU 密集型任务会阻塞 UI。
缓解:用
@st.cache_resource缓存大数据 + 用 async / thread
8. 1,210 open issues
issue 量多——主要是 feature request。
八、总结
Streamlit 不是 ” 又一个 Web 框架 ”——它是 “Python 数据科学家的 Web 应用革命 ”,7 年间 彻底改变了 ” 如何把 Python 脚本变成 Web 应用 ”。
3 个最值得用的理由:
- “ 一行代码即应用 ” 理念极强 :45K stars + 7 年沉淀 + Apache-2.0 ✅ + Snowflake 收购背书—— 数据应用领域的绝对头部
- AI 原生支持 :2024+ 的
st.chat_message/st.write_stream让 LLM Chatbot / RAG / Agent demo 10 分钟搞定——飞熊做 AI 技术咨询 必用 - 生态完整 + 部署简单 :HuggingFace Spaces 70% ML demo + Streamlit Cloud 免费 + Snowflake 集成 + streamlit-echarts 等丰富组件—— 从个人 demo 到企业应用全覆盖
1 句建议:
如果你是 Python 数据科学家 / ML 工程师 / AI 工程师 / 想快速做数据应用 demo——用 Streamlit(Apache-2.0 ✅ / 45K stars / Snowflake 收购 / HuggingFace Spaces 头部)。
如果你的场景是 Plotly 数据可视化深度集成 + 复杂 dashboard + 高性能——看 Dash (299)。
如果你的场景是 ML 模型 demo + HuggingFace Spaces 部署——看 Gradio。
如果你的场景是科学计算 / Jupyter 集成 / HoloViews——看 Panel。
如果你的场景是全栈 Web 应用 + 编译性能 + 现代前端——看 Reflex。
飞熊做 AI + IoT 技术咨询,Streamlit 是必讲项目 ——给客户做 1 周 MVP / AI demo / 数据看板,都能用上。Streamlit + ECharts(324) + Airbyte(326) + ClickHouse(322) / StarRocks(332) 是飞熊 BI 栈里 最敏捷的组合。
参考
- Streamlit GitHub · 45K stars / Apache-2.0 / Python
- Streamlit 官方文档 · 完整 API + 教程
- Streamlit Gallery · 官方应用展示
- Streamlit in Snowflake · Snowflake 集成
- Snowflake 收购 Streamlit · 2022 收购新闻
- Streamlit 2024 新特性 · fragments / forms / connections
- Streamlit vs Dash · vs Gradio 详细比较
- HuggingFace Spaces Streamlit · HuggingFace 集成
- streamlit-echarts · ECharts 集成组件
- Streamlit Cloud · 免费部署
- Streamlit Components Gallery · 官方组件生态
- Snowflake Cortex · Snowflake LLM 集成