Python Workers 现已正式发布
Cloudflare Workers 正式支持 Python,FastAPI、Django、Flask 可直接运行,还能绑定 Workers AI、R2、D1 等平台服务,冷启动与依赖管理都换成了原生方案。
中文
复制

两年前,我们推出了 Python Workers,提供了一种在 Cloudflare Workers 运行时中运行 Python 应用的方式。我们的目标是让用 Python 编写 Workers 和用 TypeScript 一样简单,并让 Python 的包和框架生态“开箱即用”。今天,Python Workers 正式 GA。
GA 意味着什么?意味着 Python 现在是 Cloudflare 开发者平台上的一等公民,获得完整支持。你可以把自己熟悉的 Python 代码、库和设计模式直接拿来,无缝接入 Workers AI、R2、D1、Hyperdrive、Durable Objects、Queues、Workflows 以及 Cloudflare 平台的其他部分。你还可以在 Python Workers 里运行 FastAPI、Django、Flask 这些流行的 Python 框架。甚至可以用 Dynamic Workers 在一个 Worker 里创建另一个 Python Worker。
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)
Python Workers 背后的历程
把 Python 带到 Cloudflare Workers 是顺理成章的选择。Workers 从 2018 年起就支持 WebAssembly,这为我们提供了运行 Wasm 编译版 Python 解释器的理想环境。借助 Pyodide,我们很快就能在 Cloudflare Workers 中支持各种各样的 Python 应用。
我们的目标是打造第一个能无限扩展 Python 应用的平台,同时让开发体验和性能与其他任何地方写 Python 应用一样轻松。
今天介绍的这些功能,是多年努力的成果。许多开发者已经在 Python Workers 上构建应用;现在,我们把这些能力打磨到生产可用,向所有人开放。
Python 现在是 Cloudflare Workers 运行时的一等语言
Python Workers 现在原生支持 Cloudflare 开发者平台的绑定。此前,在 Python Workers 中使用这些绑定,需要在 RPC 边界上把 Python 对象显式转换成 TypeScript 对象。比如,要把一个 Python 字典发送到 Cloudflare Queue,得靠下面这段胶水代码才能跑通:
from pyodide.ffi import to_js
import js
self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))
这要求 Python 开发者在编写 Python Workers 时还要时刻留意 JavaScript 环境和代码,无论对人还是 AI agent 来说,这都是常见的出错来源。为此,我们将整个类型转换过程封装进了 Workers 运行时和 Python SDK。现在你可以用符合 Python 习惯的方式使用所有 Cloudflare 绑定,无需写一行 JavaScript 代码,下面这些都能直接跑通:
self.env.QUEUE.send({"key": "value"})
Web 框架:FastAPI、Django 和 Flask
现在你可以在 Python Workers 中运行自己惯用的 Python 框架,比如 FastAPI、Django 或 Flask,用 Python 搭建 API 服务器。我们实现了一个内置连接器,可以轻松把 Web 应用接入 Python Workers。
假设你有一个简单的 FastAPI Web 应用:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
message = "Hello, world!"
return {"message": message}
在原生环境里,你会用 uvicorn 之类的 Web 服务器来运行这个应用。
$ uvicorn main:app
在 Python Workers 中,用我们提供的 workers.asgi 包就能运行同一个应用,只需把这段代码加进去:
from workers import asgi
class Default(WorkerEntrypoint):
async def fetch(self, request):
return await asgi.fetch(app, request, self.env)
# or equivalently
Default = asgi.entrypoint(app)
同样,你可以用 workers.wsgi 包来运行 Django 这类同步 Web 应用。
from workers import WorkerEntrypoint, wsgi
from your_django_app.wsgi import app
Default = wsgi.entrypoint(app)
底层发生了什么?
Python 对 Web 应用如何与 Web 服务器通信有一套标准约定,即 Web Server Gateway Interface(WSGI),以及它的现代异步版本 ASGI。有了这套标准,开发者构建的应用可以完全不依赖具体的服务器。在传统部署中,Uvicorn、Gunicorn 这类 Web 服务器负责处理大量并发的客户端连接和线程以支撑流量,而 FastAPI 这类 Web 框架则可以专注于应用逻辑本身。
在 Cloudflare Workers 中,Workers 平台本身就是 Web 服务器。我们的全球网络已经处理好了负载均衡和无限扩展,没必要在 Python Workers 里再跑一个服务器,重复造轮子。
我们的 workers.asgi 和 workers.wsgi 连接器充当的是一层轻量、经过优化的桥接。它们把传入的原生 JavaScript 请求转换成 Python 应用所期望的标准 WSGI/ASGI 结构,再把响应以极低开销传回去。这样一来,Python 开发者两头的好处都占上了:可以用自己惯用的 Web 框架来编写和组织代码,同时让 Cloudflare Workers 平台把 API 瞬间扩展到全球,全程无需配置任何服务器。
这些连接器不仅适用于 FastAPI、Django 或 Flask,也适用于任何使用 WSGI 或 ASGI 接口的 Python Web 框架。
关于各 Web 框架的具体用法,可在 Python Workers 文档中找到更多信息。
在 Hyperdrive 中使用 PostgreSQL 和 MySQL
如果你正在用 PostgreSQL 或 MySQL 这类关系型数据库构建 Python 应用,现在可以把 Hyperdrive 集成到 Python Workers 中。
此前,Python Workers 不支持 TCP socket,因此无法使用数据库驱动。要理解这一点为什么是个障碍,得先看看 WebAssembly 是如何运作的。aiomysql 或 asyncpg 这类 Python 数据库驱动依赖标准库的 socket 模块来建立连接。在标准环境中,这个模块会向底层操作系统发起 POSIX 系统调用。而在 WebAssembly 沙箱里,这些 POSIX 网络系统调用通常只是永远失败的桩,任何打开标准 socket 的尝试都会立刻失败。为了解决这个问题,我们用 Workers 的 connect API 实现了 socket 系统调用。
当数据库驱动尝试打开 TCP 连接时,会走我们自定义的 socket 系统调用实现。它把打开连接、读取字节这类标准 Python socket 操作,转换成 Workers 运行时使用的对应 JavaScript 调用。由于这层转换发生在系统调用层面,你的数据库驱动完全不需要了解底层实现。
正是这座 socket 桥梁让 Hyperdrive 集成成为可能。要在 Python Workers 中使用 Hyperdrive,先用 Hyperdrive 连接数据库,并在 Wrangler 配置中设置绑定:
"hyperdrive": [
{
"binding": "HYPERDRIVE_MYSQL",
"id": "",
}
]
然后,用你熟悉的数据库驱动连接 Hyperdrive:
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")
r = await cur.fetchall()
await cur.close()
conn.close()
关于如何在 Python Workers 中使用 Hyperdrive,以及目前支持哪些包,可以参考 Hyperdrive Python Workers 文档。
扩展 WebAssembly 包生态
Python Workers 运行在 WebAssembly 沙箱中,因此任何带有原生 C/C++/Rust 扩展的包都必须交叉编译为 WebAssembly 才能在 Python Workers 中运行。但在此之前,并没有一种标准方式能把任意 Python 包交叉编译到 WebAssembly。这意味着我们的团队只能手动编译并托管自定义的 WebAssembly 包,你能在 Python Workers 中实际使用的包也因此非常有限。
我们想解决这个问题,让用户能用上更多种类的包。但我们不想只构建仅能在 Python Workers 中使用的包,那样对社区没有好处。Python Workers 构建在 Pyodide 之上,所以我们希望生态的演进能同时惠及 Pyodide 和整个 Python-on-WebAssembly 社区。
为此,我们提出了 PEP 783,为在浏览器运行时中运行 Python 定义了一个标准化平台,称为 PyEmscripten。经过一年多的讨论和打磨,该提案已被接受,包维护者现在可以为 PyEmscripten 平台构建并发布包,并让这些包在所有实现 PyEmscripten 的环境中可用。
我们还稳定了现有的 Pyodide 构建工具链,并将其演进为所有包维护者都能使用的形式,让开发者可以轻松为 PyEmscripten 平台构建包。此外,我们为 cibuildwheel 添加了 PyEmscripten 平台支持,方便其他人跟进支持这一平台。
生态仍在采纳这一标准,但我们希望未来每个 Python 包都有一个可在 WebAssembly 中使用的 wheel。我们也在积极与各大包的维护者合作,添加 PyEmscripten 构建。如果你遇到尚未支持的包,欢迎在 Discord 或 GitHub 上告诉我们,我们的团队会着手构建。
你也可以观看我们在 EuroPython 2026 的演讲 “Python Everywhere: The State of Python on WebAssembly”,了解我们是如何做到这一点的。
用 Python 构建 AI agent 和 pipeline
数据科学与机器学习包生态庞大,用 Python 构建智能 agent 和 AI pipeline 是顺理成章的选择。但要把它们搬进 Python Workers,一直有个难题:openai、langchain 这类库依赖 requests 或 httpx 等 HTTP 客户端与外部 API 通信,而 Python Workers 缺少底层 socket 操作支持,这些 HTTP 客户端无法正常工作。
为此我们向上游提交了改动,让这些 HTTP 客户端在 WebAssembly 环境中可以直接通过 JavaScript 的 fetch API 发送请求。加上上一节介绍的对底层 socket 操作的新支持,整条网络栈现在都能在 Python Workers 里顺畅运行。
这样一来,openai、langchain、mcp 等 AI 库都能直接在 Python Workers 中运行。你还可以把它们和 Workers AI 结合,在 Cloudflare 网络的 GPU 上做无服务器推理,或者通过 Cloudflare AI Gateway 代理请求。
下面的例子演示了如何在 langchain 中运行 Worker AI 模型,用的是 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})
现在就能构建什么
我们在 python-workers-examples 仓库里整理了一批可直接用于生产的模式。以下是 Python Workers 与 Cloudflare 生态结合的一些用法。
异步 AI 编排
构建一个全栈 AI 应用,往往要串联存储、队列、推理等多个服务。这个示例展示了如何完全用 Python Workers 构建一个 AI 驱动的图生图工具:接收用户请求,投入 Cloudflare Queue,用 Workflows 编排经由 Workers AI 的图像生成步骤,再把图片存入 R2 bucket。

用 Bluesky Jetstream 做实时流处理
消费实时事件洪流通常需要一台专用服务器来维持连接。这个示例中,我们用 Python Worker 连接 ATProto/Bluesky Jetstream WebSocket。借助 Durable Object 支撑这条连接,Python Worker 可以维持长期状态,保证 WebSocket 连接不掉线。

更多示例
Model Context Protocol(MCP)Server
构建并部署一个 MCP server,使用官方 Python MCP 包,让你的 AI 助手能够访问边缘数据。

基于 Vectorize 的检索增强生成(RAG)系统
构建一个 RAG 系统,使用 Workers AI 和 Vectorize——Cloudflare 的向量数据库。

Cloudflare 开发者文档中的 Python 代码示例
我们已更新 Cloudflare 各产品的文档,加入了 Python 示例代码。几乎每一处展示如何用 TypeScript 完成某项操作的代码示例,都配有对应的 Python 版本。我们会继续在所有产品中加入 Python 示例。在开发者文档中,你可以在 JavaScript、TypeScript 和 Python 之间切换代码片段。

下一步
正式发布只是开始。我们有很多计划要让 Python Workers 变得更好,包括提升性能和内存效率,以及支持更多包。
继续告诉我们你想用 Python Workers 构建什么,我们会继续拓展可能性的边界。查看 Python Workers 文档,开始构建你的第一个 Python Worker!