st.session_state 的存储机制
st.session_state
的存储机制,这个东西很多人第一次用 Streamlit 会误会它是“数据库”或者“浏览器存储”,其实不是。
1️⃣ 它存储到哪里?
st.session_state
是存在 Streamlit 服务器内存里的,和你启动的 Python 进程绑在一起。- 每个访问页面的浏览器会话(session)在服务器端会有一个独立的
session_state
对象。 - 它不写入文件、不存数据库、不存浏览器本地存储,所以它完全依赖这个 Python 进程的内存。
2️⃣ 为什么刷新浏览器不会丢失?
- Streamlit 的刷新(包括触发交互)并不会重启整个 Python 进程,它只是让脚本重新执行一次。
- 只要你还是同一个浏览器 tab、同一个 session id,Streamlit 会从内存里取出之前的
st.session_state
。 - 所以刷新页面(F5)或者点击按钮,变量还是能保留。
3️⃣ 什么情况下会丢失?
st.session_state
会在以下情况消失:
场景 | 为什么会丢失 |
---|---|
重启 Streamlit 服务器 | Python 进程结束,内存清空,自然丢失 |
不同浏览器 / 不同标签页访问 | 新的会话 id,新的 session_state |
清除浏览器 Cookie | 会话 id 丢了,Streamlit 认为你是新用户 |
长时间不活动被断开 | Streamlit 会回收闲置会话的内存 |
直接用 python script.py 运行 | 不是在 streamlit run 模式下,没有会话管理功能 |
4️⃣ 重点结论
-
它是内存级会话存储,不是持久化存储。
-
想永久保存,就得自己写到:
- 文件(JSON、pickle)
- 数据库(SQLite、PostgreSQL 等)
- 浏览器本地存储(前端方案)