Session State
st.session_state 像一本跟「這個使用者、這次瀏覽」綁在一起的字典。重新整理網頁會清空;另一個使用者看不到你的內容。
一定要先初始化
import streamlit as st
if "counter" not in st.session_state:
st.session_state.counter = 0
if st.button("加一"):
st.session_state.counter += 1
st.write("目前次數:", st.session_state.counter)
漏掉 if ... not in 就會每次重跑都設回 0,看起來像按鈕壞掉。
Widget 與 key
有 key 的 Widget 會自動把值寫進 Session State。Callback 則用來在重跑前同步兩個 Widget,例如公斤/磅換算。官方工程師的逐步示範見 Session State 影片。
def lbs_to_kg():
st.session_state.kg = st.session_state.lbs / 2.2
st.number_input("磅", key="lbs", on_change=lbs_to_kg)
st.number_input("公斤", key="kg")
什麼時候用它?
- 計數器、多步驟精靈、wizard
- 聊天訊息清單
- 登入後記住使用者
- 跨頁分享目前選取的列或篩選條件
不要用它取代快取:讀 500 MB CSV 應走 @st.cache_data,不是塞進 Session State 複製一份給每個使用者。