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 等)
    • 浏览器本地存储(前端方案)

更多推荐