重新執行模型
Streamlit 跟 Flask、Django 不一樣:它沒有你手寫的路由與回呼迷宮。你寫的是一支由上往下執行的 Python 腳本。畫面要更新時,這支腳本會再跑一次。
什麼時候會重跑?
- 你儲存了原始碼。
- 使用者操作 Widget:拖滑桿、按按鈕、選下拉選單、輸入文字。
每次重跑都是乾淨的一次執行。普通的 Python 變數會回到初始值,所以下面的計數器不會累加:
要記住次數,必須用 Session State。讀大檔或載入模型則要用 快取,否則每次拖滑桿都會重做昂貴計算。
Callback 何時執行?
Widget 若設了 on_change 或 on_click,callback 會在腳本其餘部分之前先跑。這讓你能在重跑前先改 Session State,例如兩個輸入欄互相換算單位。細節見官方 Session State 影片。
flowchart TD
A[使用者操作 Widget] --> B{有 callback?}
B -->|有| C[先執行 on_click / on_change]
B -->|沒有| D[從頭執行整支腳本]
C --> D
D --> E[依最新 Widget 值重畫畫面]
為什麼這個設計很重要?
因為你可以像寫 Jupyter notebook 或分析腳本一樣寫 App:讀資料、畫圖、加篩選器。不必管理前端狀態樹。代價是:任何要跨互動存活的東西,都要明確放進 Session State 或快取。
這是 Streamlit 最核心的 20% 觀念。後面幾乎所有「為什麼按鈕沒作用」的問題,都從這裡開始解。