首页 / 开源热榜 / Streamlit / 使用教程

Streamlit 中文教程:从一次重跑理解状态和缓存

官方资料核对:2026-09-23 · 文档与源码核对,未安装或运行应用

Streamlit 让 Python 脚本直接输出输入控件、表格、图表、布局和聊天界面。它上手快,但交互后脚本如何重跑、状态保存在哪里、缓存是否跨用户,决定了应用是否正确。

本文保留它是因为官方框架仍在更新,不以本站搜索流量声称热度。

1. 1.64.0 的版本事实

官方在 2026-09-15 发布 1.64.0,对应提交 bab1da9。这一版加入原生 st.echarts_chart、异步感知的 st.cache_datast.cache_resource,还给多个输入组件增加事件选项,并修复重跑、Altair、PyDeck 和 Custom Components v2 的问题。包要求 Python 3.10 以上。

2. 浏览器事件为什么会重跑脚本

streamlit run 启动 Python 服务,浏览器通过 WebSocket 建立会话。脚本执行时,st.* 命令把页面变化发给前端。用户改变滑块或输入框后,事件返回服务器,框架通常从上到下再执行一次脚本。

因此,发送邮件、扣款、写文件等副作用不能放在每次都会走到的顶层代码里。按钮回调也需要幂等设计。能缩小到 fragment 的交互不要重跑整个应用。

3. 安装固定版本并启动最小应用

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install "streamlit==1.64.0"
python -m pip freeze > requirements.lock.txt

新建 app.py

import streamlit as st

st.title("重跑观察")
st.session_state.setdefault("runs", 0)
st.session_state.runs += 1

x = st.slider("x", 0, 10, 2)
st.write("本会话脚本执行次数", st.session_state.runs)
st.write("x 的平方", x * x)
streamlit run app.py --server.address 127.0.0.1

拖动滑块后执行次数会上升,这能直接看到重跑。不同浏览器会话有各自的 Session State;它不是数据库,也不应保存必须长期存在的业务记录。

4. 两类缓存解决不同问题

接口适合内容主要风险
st.cache_data查询结果、转换后的 DataFrame、可序列化计算参数或依赖没进入缓存键时会返回旧数据
st.cache_resource模型、连接池、重量级共享资源跨会话共享同一对象,需要线程安全与用户隔离
Session State当前 WebSocket 会话的控件和流程状态断线或重建会话后不能保证持久

用户私有数据不要塞进全局资源缓存。缓存函数还要设置合理 TTL 和清理方式,模型或数据库连接升级时主动失效。

5. 上传、密钥和自定义 HTML

上传文件名、内容、查询参数和表单字段都是不可信输入。限制大小与类型,在隔离目录解析,不把用户文件名直接拼接成磁盘路径或 shell 命令。第三方组件也会扩大前端供应链范围。

本地密钥可放 .streamlit/secrets.toml,但必须加入忽略规则;云端使用平台密钥设置。不要用 st.write、异常栈或缓存键输出秘密。

6. 对外部署需要补 Web 服务边界

本地开发先绑定 127.0.0.1。对外提供时增加身份验证、TLS、反向代理、请求和上传限制、依赖锁定、进程隔离、超时和日志脱敏。模型推理或长任务应移入队列,避免一个会话占住整个进程。

Streamlit Community Cloud 当前由官方描述为免费服务,可连接 GitHub 仓库部署。它的资源、休眠、隐私和可用性规则与自托管不同;企业 Snowflake 路径另行评估。

7. 与 Gradio 怎么选

相比 Gradio,Streamlit 更偏完整的数据应用,提供表格、布局、导航、Session State、缓存和多页结构。Gradio 以 Python 函数或模型为中心,Interface 与 Blocks 更适合快速做输入输出演示,并可生成可调用 API。数据仪表盘和分析工作流先看 Streamlit;包装单个模型或函数演示时,Gradio 通常步骤更少。

8. 当前验证边界

验证状态:本轮核对官方 README、架构、运行、缓存、Community Cloud 文档、1.64.0 pyproject 与 GitHub Release。没有安装包、启动应用或部署云端。

验证边界:未验证浏览器会话、重跑、缓存一致性、上传内存、认证、性能和 Cloud 限额。示例需要读者在隔离环境执行。

这里仅补原教程没有展开的事实和边界。安装命令与操作步骤仍以前文为准。

先判断这个项目是否适合你

近期变化与关注原因

保留教程的依据是官方在 2026-09-15 发布 1.64.0,加入原生 ECharts、异步缓存支持、输入组件新事件模式并修复多项重跑和组件问题。

适合谁用

适合数据探索、内部报表、模型演示、审批工具和聊天原型。它的脚本重跑模型便于快速开发,但复杂前端交互、长期后台任务、细粒度 API 服务和高并发产品需要额外架构。上传文件、查询参数、用户输入和自定义 HTML 都应按不可信输入处理。

原教程未展开的系统信息

核心功能

  • 纯 Python UI

    用 st.* 命令声明文本、控件、数据表、图表、媒体、布局与聊天界面,不要求先写 JavaScript 前端。

  • 脚本重跑

    启动本地服务器后,每个浏览器会话通过 WebSocket 连接;用户交互通常触发脚本自上而下重新执行。

常见问题

Streamlit 为什么点击控件后会重新执行代码?

浏览器把组件事件发回服务器后,Streamlit 通常从上到下重跑脚本并重新生成页面。用 Session State 保存会话值,用 fragment 缩小重跑范围,用缓存避免重复的数据或资源初始化。

st.cache_data 和 st.cache_resource 应该怎么选?

cache_data 适合查询结果和可序列化数据,会向调用方返回副本;cache_resource 适合模型、数据库连接等共享对象。共享资源必须线程安全,不能混入某个用户的私有状态。

Streamlit 的 Session State 能替代数据库吗?

不能。Session State 跟随当前 WebSocket 会话,刷新、重连或服务重启都可能改变生命周期。需要审计、跨设备或长期保存的数据应写入正式存储。

本地 Streamlit 应用可以直接开放到公网吗?

不要把开发命令直接当生产部署。先绑定 127.0.0.1;对外提供时增加认证、TLS、反向代理、请求和上传限制、依赖锁定、日志脱敏及进程隔离。

Streamlit Community Cloud 是付费升级吗?

官方当前把 Community Cloud 描述为免费服务。它会连接 GitHub 并运行应用,资源、休眠、隐私和可用性规则与自托管不同;企业 Snowflake 路径应另行评估。