Cloudflare Python Workers 支援 Django、Flask:WSGI 與 ASGI 怎麼選?
Cloudflare 在 2026 年 9 月 2 日宣布,Python Workers 現在可以接上遵循 WSGI 或 ASGI 規格的 Python web framework。這讓 Django、Flask、FastAPI 或 Starlette 專案有機會直接放到 Workers runtime,但第一步不是把原本的啟動指令搬過去,而是先確認應用程式使用哪一種 web protocol。
直接答案是:Flask 通常接 workers.wsgi;FastAPI 與 Starlette 接 workers.asgi;Django 兩者都能用,依你的 middleware、view 和資料庫 backend 選擇。 Cloudflare 提供的是 adapter,不是把所有 Python 套件自動轉成可在邊緣執行的版本;依賴、secret、靜態資產與資料庫行為仍要在本機和部署環境驗證。
先按 framework 選 WSGI 或 ASGI
WSGI 和 ASGI 是應用程式與 web server 之間的介面。你不需要自己在 Worker 裡開 socket,但必須讓 Workers runtime 使用正確的 adapter,否則最小路由可能能啟動,實際 middleware 或非同步處理卻會在請求時出錯。
| Framework/情境 | 優先選擇 | Workers 入口 | 判斷重點 |
|---|---|---|---|
| Flask | WSGI | wsgi.entrypoint(app) | Flask 官方模型是同步 WSGI |
| Django 的同步 view、同步 ORM | WSGI | wsgi.entrypoint(app) | 先保留既有同步 middleware 與資料庫呼叫 |
| Django 的非同步部署 | ASGI | asgi.entrypoint(app) | 需要逐一確認 middleware 和 async view |
| FastAPI、Starlette | ASGI | asgi.entrypoint(app) | 這些 framework 的主要介面是 ASGI |
Cloudflare 的 Python Workers 公告也用同一個方向區分:Django、Flask 使用 WSGI,FastAPI、Starlette 使用 ASGI。不要因為 ASGI 聽起來比較新,就把所有 Django 專案直接改成 ASGI。 先用現有依賴和實際請求路徑做一個最小驗證。
先用官方範本啟動 Django
如果你要評估 Django,官方文件提供了可以直接建立專案的範本。先在隔離資料夾執行:
uv run pywrangler init django-worker \ --template https://github.com/cloudflare/python-workers-examples/tree/main/djangocd django-workeruv run pywrangler dev先用 curl 或瀏覽器確認首頁,再把自己的 settings、middleware 和資料庫設定逐項搬入。這個順序能把「Workers adapter 問題」與「原專案設定問題」分開,不會一開始就被完整 production 設定淹沒。
Flask:用 WSGI adapter 接最小路由
Cloudflare 的 Flask 範例可以縮成下面這個 Worker。Default 是交給 Workers runtime 的 entrypoint,Flask 的 app 則仍然是原本的 WSGI application:
from flask import Flaskfrom workers import wsgi
app = Flask(__name__)
@app.get("/")def index(): return {"message": "Hello from Flask"}
Default = wsgi.entrypoint(app)本機啟動使用 uv run pywrangler dev。第一個測試不要先接資料庫或大型前端,先確認 status code、JSON response、錯誤處理與一個需要 request context 的 route 都正常,再增加 blueprint、extension 和 template。
Django:WSGI 與 ASGI 只差一個 adapter,驗證範圍不只一行
Django 的 WSGI 版本可以使用 get_wsgi_application():
import os
from django.core.wsgi import get_wsgi_applicationfrom workers import wsgi
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
app = get_wsgi_application()Default = wsgi.entrypoint(app)如果專案確實要走 ASGI,改用 get_asgi_application() 和 workers.asgi:
import os
from django.core.asgi import get_asgi_applicationfrom workers import asgi
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
app = get_asgi_application()Default = asgi.entrypoint(app)Cloudflare 的 Django 文件指出,Python Workers 對 ASGI 做了最佳化,但 WSGI 仍與 Django 相容。這代表選擇時應看專案的實際同步/非同步邊界,而不是只看 adapter 名稱。
若使用 Cloudflare 文件提到的 django-cf,D1 和 Durable Objects backend 會驅動同步 Django ORM,應先走 WSGI 路徑;文件也提醒這些 backend 不支援 Django transaction。這不是 adapter 可以補上的差異,必須在資料層測試中明確記錄。
Secret 和靜態資產要分開處理
不要把 SECRET_KEY 或其他 production 值寫進 settings.py 並提交到 repository。Django 在 Workers 上可以從 Worker secret 讀取:
from workers import env
SECRET_KEY = env.DJANGO_SECRET_KEY再用 Wrangler 建立 secret:
uv run pywrangler secret put DJANGO_SECRET_KEY如果 Flask 前面還有獨立的前端,Cloudflare 的文件建議用 Workers Static Assets,並透過 run_worker_first 讓 API route 先交給 Worker 處理。設定檔可先從這個最小片段開始:
{ "assets": { "directory": "./public/", "binding": "ASSETS", "run_worker_first": true }}這樣做的好處是前端檔案不必全部塞進 Worker bundle;但仍要測試 unmatched path、404、cache header 和 API/資產路由衝突,不要只確認首頁有出現。
部署前用這份清單收斂風險
Python Workers 目前仍在 Cloudflare 文件的 Beta 分類中,第一次採用時應把 runtime 相容性當成部署條件,而不是把本機 Python server 能啟動視為完成。
| 檢查項目 | 你要留下的證據 |
|---|---|
| Adapter | Flask/同步 Django 使用 WSGI;FastAPI/Starlette 或確定的 async Django 使用 ASGI |
| Entry point | Default = wsgi.entrypoint(app) 或 Default = asgi.entrypoint(app) 可被本機 dev server 載入 |
| Dependencies | pyproject.toml 的套件逐一在 Workers runtime 跑過,特別是 native extension 和檔案系統依賴 |
| Secret | 本機 dev、preview、production 的 secret 名稱一致,值沒有進 Git |
| Data layer | D1、Durable Objects 或外部服務的延遲、transaction 和錯誤路徑已測試 |
| Assets | API、前端、404 和 cache 行為在部署 URL 實際驗證 |
如果只想先證明「框架能不能跑」,先完成一個無資料庫的 Flask 或 Django route;如果目標是把既有服務搬上去,再把資料庫、背景工作、檔案上傳和 observability 拆成獨立驗證項目。邊緣 runtime 的成功標準應是每一個依賴都能被說明,而不是只有 pywrangler dev 沒有報錯。
結論:先對齊 protocol,再處理 runtime 差異
Cloudflare Python Workers 支援 WSGI 和 ASGI,降低了 Django、Flask、FastAPI 與 Starlette 評估時的接入門檻,但不會消除 Python runtime 與傳統伺服器的差異。先按 framework 選 adapter,用官方最小範例跑通,再獨立驗證 secret、靜態資產、資料庫與套件相容性,會比直接搬整個 production 專案更容易定位問題。
常見問題
Q: Django 一定要改成 ASGI 嗎?
A: 不一定。Cloudflare 文件說 Python Workers 對 ASGI 做了最佳化,但 Django 仍可使用 WSGI。若專案主要是同步 view、同步 ORM 或使用需要 WSGI 的 backend,先從 WSGI 開始,等 async 邊界和 middleware 都驗證後再評估 ASGI。
Q: Flask 可以直接使用 workers.asgi 嗎?
A: 不應直接假設可以。官方 Flask 範例使用 workers.wsgi,因為 Flask 的主要介面是 WSGI。若要改變 protocol,必須先確認 framework、extension 和 middleware 的正式支援,不是只替換 import。
Q: 把 secret 放進 .env 就能部署嗎?
A: .env 適合本機開發,但 production secret 應透過 Wrangler secret 或平台的 secret 管理功能注入。部署前也要確認 settings 讀取的是 Workers binding,而不是意外依賴本機環境變數。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。