Cloudflare Python Workers 完整教學 2026:Python 正式 GA、FastAPI/Django 直接跑上邊緣(pywrangler 安裝、Hello World、Workers AI、Hyperdrive 與限制陷阱一次學會)

Cloudflare 在 2026 年 9 月 21 日宣布 Python Workers 正式 GA:Python 成為 Workers 平台上的一級語言,可以直接部署 FastAPI、Django、Flask,透過 bindings 使用 KV、D1、R2、Queues、Durable Objects 與 Workers AI,並能用 aiomysql/asyncpg 搭配 Hyperdrive 連 PostgreSQL/MySQL。本文從 uv 與 pywrangler 安裝、四行 Hello World、前端/後端 API 實作、AI 與資料庫整合,到支援套件範圍、CPU 與記憶體限制、免費與付費額度、常見錯誤排錯,一次完整走完。

  • Dennis
  • 10 分鐘閱讀
Cloudflare Python Workers 完整教學 2026:Python 正式 GA、FastAPI/Django 直接跑上邊緣(pywrangler 安裝、Hello World、Workers AI、Hyperdrive 與限制陷阱一次學會)

Cloudflare Python Workers 在 2026 年 9 月 21 日正式 GA:Python 現在是 Cloudflare Workers 平台上的一級語言。你可以在邊緣節點上直接執行 FastAPI、Django、Flask,用 Python 語法呼叫 KV、D1、R2、Queues、Durable Objects 與 Workers AI,還能用 aiomysqlasyncpg 透過 Hyperdrive 連 PostgreSQL/MySQL。免費方案每天 10 萬次請求、每次 10 毫秒 CPU 時間。

這不是一個「多支援一種語言」的例行更新。Python Workers 從 2024 年進入預覽到 2026 年 9 月轉正式版,中間解的幾個問題(型別轉換、Web 框架、TCP socket、套件生態)剛好都是過去把它當玩具的原因。這篇文章從零走完一輪:安裝、部署、API、資料庫、AI,然後把限制與費用講清楚——包含哪些套件其實還跑不動。

30 秒認識 Python Workers

項目內容
定位Cloudflare Workers 平台上的一級 Python runtime(Serverless、全球邊緣)
正式 GA 日期2026 年 9 月 21 日(先前為期約兩年的預覽)
底層執行環境Pyodide(WebAssembly 化的 CPython),跑在 Workers 的 isolate 中
CLI 工具pywranglerworkers-py 套件,包裝 wrangler)
前置需求uv(Python 套件管理器)與 Node.js
Python 版本requires-python >=3.13
Web 框架FastAPI(ASGI)、任何 ASGI/WSGI 框架、Django/Flask(WSGI)
平台整合KV、D1、R2、Queues、Durable Objects、Workflows、Vectorize、Hyperdrive、Workers AI
免費額度每天 10 萬次請求、每次 10 毫秒 CPU、128 MB 記憶體
付費方案最低 $5/月,含每月 1,000 萬次請求、3,000 萬 CPU 毫秒
必加設定compatibility_flags 需包含 python_workers

GA 之後,跟預覽版差在哪裡

第一代 Python Workers 有個很痛的設計:Python 物件要進到 Cloudflare 的 binding,得先手動轉成 JavaScript 物件。 例如把一個 dict 丟進 Queue,你得這樣寫:

from pyodide.ffi import to_js
import js

self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))

GA 版把整套型別轉換封裝進 runtime 與 Python SDK,同一件事變成:

self.env.QUEUE.send({"key": "value"})

差別不只是少兩行。原本那種寫法要求寫 Python 的人隨時記得底下有一層 JavaScript,Cloudflare 官方也直言這是「人類與 AI agent 都常出錯的地方」。現在 Python 端完全不用寫任何 JavaScript。

另外三個 GA 帶來的關鍵能力:

  1. Web 框架原生支援。 Workers 平台本身就是 web server,不需要在 Python 裡再跑 uvicorn 或 gunicorn。Cloudflare 提供 workers.asgiworkers.wsgi 兩個薄轉接層,把進來的請求轉成 ASGI/WSGI 標準結構,回應再轉回去。
  2. TCP socket 打通,資料庫驅動能用。 以前 Python Workers 沒有 TCP socket,asyncpgaiomysql 這類驅動全部不能用。Cloudflare 用 Workers 的 connect API 實作了 socket 的 system call,於是驅動程式在不知情的情況下就能連上 Hyperdrive 後面的 PostgreSQL/MySQL。
  3. 套件生態有了標準。 Python Workers 跑在 Wasm 沙盒裡,所有含 C/C++/Rust 原生擴充的套件都必須交叉編譯成 WebAssembly。Cloudflare 提出並推動 PEP 783(PyEmscripten) 被接受,還把 PyEmscripten 平台支援加進 cibuildwheel——這代表今後是「套件作者自己出 wasm wheel」,而不是 Cloudflare 一家一家手動編。

Step 1:安裝與建立專案

先確認本機有 uv 與 Node.js,然後在你要放專案的目錄執行:

uvx --from workers-py pywrangler init

這個指令會建立 pyproject.toml(把 workers-py 加為開發相依)與 wrangler 設定檔,並讓你從範本中挑一個起手。

如果你想要現成的範例,直接 clone 官方範例庫:

git clone https://github.com/cloudflare/python-workers-examples
cd python-workers-examples/hello

一個最精簡的 Python Worker 專案 pyproject.toml 長這樣:

[project]
name = "hello-python-worker"
version = "0.1.0"
description = "My first Python Worker"
requires-python = ">=3.13"
dependencies = [
    "fastapi"
]

[dependency-groups]
dev = [
    "workers-py",
    "workers-runtime-sdk"
]

pywrangler 部署時會自動把你的相依套件打包進 worker bundle,你不需要自己處理 wasm 檔案。

Step 2:四行 Hello World

Python Worker 的進入點是一個 Default 類別,繼承 WorkerEntrypoint,並實作 fetch

from workers import WorkerEntrypoint, Response

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        return Response("Hello World!")

對照 TypeScript 版本的 export default { async fetch(request, env, ctx) {...} },Python 版把 handler 收進類別裡,env(環境變數與 bindings)則掛在 self.env 上。

很重要的一點:wrangler 設定檔一定要有 python_workers compatibility flag,否則不會以 Python Worker 執行:

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "hello-python-worker",
  "main": "src/entry.py",
  "compatibility_flags": [
    "python_workers"
  ],
  "compatibility_date": "2026-09-23",
  "vars": {
    "API_HOST": "example.com"
  }
}

本地開發與部署:

uv run pywrangler dev        # 本機 http://localhost:8787
uv run pywrangler deploy     # 部署到 <worker>.<subdomain>.workers.dev

pywrangler 支援 wrangler 的所有子命令,完整清單可以跑 uv run pywrangler --help

Step 3:核心 API 速查

讀取 JSON 請求並回傳:

from workers import WorkerEntrypoint, Response

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        body = await request.json()
        name = body["name"]
        return Response(f"Hello, {name}!")

request 是透過 FFI 暴露的 JavaScript Request 物件,所以你可以直接呼叫 await request.json()request.headers 這類 JS 端 API。

回傳 JSON:

return Response.json({"message": "Hello", "status": "ok"})

讀環境變數與 secret:

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        return Response(self.env.API_HOST)

拆成多個模組src/entry.py + src/hello.py)就跟一般 Python 一樣用 from hello import hello,改檔後 pywrangler dev 會自動重載。想要型別提示與自動補全,把 workers-runtime-sdk 加進相依,並執行:

uv run pywrangler types

這會依你的 bindings 與 compatibility_date 產生 Env 型別。

Step 4:把 FastAPI、Django、Flask 搬上邊緣

這是 GA 最有感的改變。你原本的 FastAPI 應用幾乎不用改:

from fastapi import FastAPI, Request
from workers import asgi, WorkerEntrypoint

app = FastAPI()

@app.get("/")
async def root(request: Request):
    env = request.scope["env"]
    return await env.AI.run(
        "@cf/openai/gpt-oss-120b",
        {
            "instructions": "You are a friendly assistant.",
            "input": "What is the origin of the phrase Hello, World?",
        },
    )

Default = asgi.entrypoint(app)

等價的寫法(想自己控制 fetch 時用):

from workers import asgi, WorkerEntrypoint

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        return await asgi.fetch(app, request, self.env)

Django 或 Flask 這種同步框架走 WSGI:

from workers import wsgi
from your_django_app.wsgi import app

Default = wsgi.entrypoint(app)

在傳統環境你要跑 uvicorn main:appgunicorn 來處理連線與執行緒;在 Workers 上,平台本身就是 web server,負載平衡與水平擴充由 Cloudflare 網路負責,workers.asgiworkers.wsgi 只做請求與回應格式的翻譯,不另外跑伺服器行程。

Step 5:資料庫——Hyperdrive + 你熟悉的驅動

有了 socket bridge,Python 的資料庫驅動可以直接連 Hyperdrive。先在 wrangler 設定 binding:

"hyperdrive": [
  {
    "binding": "HYPERDRIVE_MYSQL",
    "id": "<你的 hyperdrive id>"
  }
]

然後用一般寫法連線:

import aiomysql
from workers import WorkerEntrypoint

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        hd = self.env.HYPERDRIVE_MYSQL
        conn = await aiomysql.connect(
            host=hd.host,
            port=int(hd.port),
            user=hd.user,
            password=hd.password,
            db=hd.database,
            ssl=None,
        )

        cur = await conn.cursor()
        await cur.execute("SELECT username FROM user")
        rows = await cur.fetchall()
        await cur.close()
        conn.close()
        return Response.json({"rows": [list(r) for r in rows]})

PostgreSQL 對應 asyncpg,目前支援的驅動清單以官方 Hyperdrive 文件為準。

Step 6:在邊緣跑 AI(Workers AI、LangChain、MCP)

Python Workers 現在也支援 openailangchainmcp 等 AI 套件——這在過去會因為 requestshttpx 缺少底層 socket 而失效,Cloudflare 選擇上上游貢獻,讓這些 HTTP client 在 Wasm 環境改走 JavaScript 的 fetch

搭配 Workers AI binding 與 langchain-cloudflare 的官方範例:

from langchain_cloudflare import ChatCloudflareWorkersAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from workers import Response, WorkerEntrypoint

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        prompt = PromptTemplate.from_template(
            "In one sentence, describe a great day in the life of an {profession}."
        )
        llm = ChatCloudflareWorkersAI(
            model_name="@cf/meta/llama-3.3-70b-instruct-fp8-fast",
            binding=self.env.AI,
            max_tokens=64,
        )
        chain = prompt | llm | StrOutputParser()
        result = await chain.ainvoke({"profession": "electrician"})
        return Response.json({"result": result})

官方範例庫裡已經有幾個可直接部署的生產級模式:

範例內容
image-redraw純 Python 的圖生圖服務:Queues 排隊 + Workflows 編排 + Workers AI 推論 + R2 存圖
websocket-stream-consumer用 Python Worker 接 ATProto/Bluesky Jetstream WebSocket,靠 Durable Object 維持長連線狀態
mcp-server用官方 Python MCP 套件建一個 MCP server,讓 AI 助手存取邊緣資料
vectorize-rag用 Workers AI + Vectorize 向量資料庫做 RAG
fastapi-todoFastAPI + D1 實作 Todo-Backend 規格

限制與陷阱(先看這段再決定要不要用)

Python Workers 的限制比 TypeScript 版本更多,因為底層是 Wasm 沙盒。

限制項目FreePaid
每日請求100,000 / 天(超過回 Error 1027)無上限
每次請求 CPU 時間10 ms預設 30 秒,最高可調到 5 分鐘
記憶體(每個 isolate)128 MB128 MB
Subrequest50 / 請求10,000 / 請求
同時對外連線6 / 請求6 / 請求
Worker 大小64 MiB64 MiB
啟動時間1 秒1 秒
Worker 數量100500

套件相容性是最大的地雷:

  • 純 Python 套件沒問題;含原生擴充的套件必須有 PyEmscripten 或 Pyodide 提供的 wasm wheel,否則裝了也跑不起來。
  • HTTP client 只支援非同步的 aiohttphttpx。同步的 requests 不行;真的要用,得改走 JS 的 fetch API(透過 FFI)。
  • 生態還在遷移中。Cloudflare 官方請使用者在 Discord 或 GitHub 回報「缺少 wasm wheel」的套件,他們會協助跟維護者溝通。

其他容易踩到的坑:

症狀原因與解法
部署後沒當成 Python 執行wrangler 設定缺 compatibility_flags: ["python_workers"]
第一次打開 workers.dev 出現 523首次設定子網域常見,等 1 分鐘左右會自己好
Error 1102(exceeded resource limits)超過 CPU 時間或記憶體;付費方案可把 cpu_ms 調高,或把重運算拆小、搬到 Durable Objects
Error 1027Free 方案每日 10 萬請求用完,隔日 UTC 00:00 重置
import 失敗、套件找不到該套件沒有 wasm wheel;換等價的純 Python 套件或等上游出 PyEmscripten 版
大檔案回應出錯別把整個 payload 留在記憶體,改用串流或把資料放 KV/R2/D1

費用:什麼時候選免費、什麼時候該付 $5

方案費用包含
Workers Free$0100,000 請求/天、每次 10 ms CPU、KV 每日 100,000 次讀取、Hyperdrive 每日 100,000 次查詢
Workers Paid(Standard)最低 $5/月/帳號每月 1,000 萬請求(超出 $0.30/百萬)、3,000 萬 CPU 毫秒(超出 $0.02/百萬)、無 egress 費用
靜態檔案免費且不計次靜態資源請求不列入 Worker 請求計費

舉個實際的算式:每月 1,500 萬次請求、平均每次用 7 ms CPU,月費是 $5(訂閱)+ $1.5(請求)+ $1.5(CPU)= $8。同樣規模的自架 VPS 光是維運時間就不只這個成本。

免費方案的 10 ms CPU 是關鍵限制:純 API 路由、資料查詢轉發、輕量 AI 代理都很夠用;但要把整個 Django 應用(含模板渲染)跑在免費方案上,很可能直接撞到 CPU 上限。需要模板渲染或大量運算,請直接考慮 $5 的付費方案。

什麼時候該用、什麼時候不該用

你的情境建議
寫 API、Webhook、輕量後端、AI 代理✅ 非常適合,全球邊緣部署、零維運
想把手上的 FastAPI/Flask 服務改成免維運✅ 適合,workers.asgiworkers.wsgi 幾乎不用改程式
定時任務、爬蟲排程✅ 適合,用 Cron Triggers(Free 每個帳號 5 個)
需要連既有 PostgreSQL/MySQL✅ 適合,Hyperdrive + asyncpgaiomysql
需要特定含原生擴充的 Python 套件⚠️ 先確認有 wasm wheel,否則會卡住
大量 CPU 運算、影像處理、機器學習訓練❌ 不適合,CPU 與記憶體限制太緊,請用 Containers 或 VPS
需要長時 WebSocket 或常駐背景行程⚠️ 需要 Durable Objects 配合,不是直接相容
需要寫入本機檔案、使用作業系統功能❌ Wasm 沙盒沒有真正的檔案系統與 POSIX 環境

站內延伸閱讀

資料來源

本文程式碼與限制數字取自 Cloudflare 官方公告與開發文件(2026 年 9 月)。套件支援範圍仍在快速變動,動手前請以官方文件最新版本為準。

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友