两年前,我们推出了 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 开发者平台的绑定(binding)。此前,要在 Python Workers 中使用这些 Cloudflare 绑定,必须在 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 智能体来说都是常见的出错来源。为了解决这个问题,我们把整个类型转换过程封装在了 Workers 运行时和 Python SDK 内部。这样你就能以 Python 的方式使用所有 Cloudflare 绑定,而无需写一行 JavaScript 代码,下面的代码开箱即用:
self.env.QUEUE.send({"key": "value"})
Web 框架:FastAPI、Django 和 Flask
现在,你可以在 Python Workers 中运行自己喜欢的 Python 框架,比如 FastAPI、Django 或 Flask,来构建 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 应用,现在可以在 Python Workers 中集成 Hyperdrive。
此前,Python Workers 不支持 TCP 套接字,导致数据库驱动无法使用。要理解这为什么是个阻碍,需要看看 WebAssembly 是如何运作的。aiomysql 或 asyncpg 这样的 Python 数据库驱动依赖标准库的 socket 模块来建立连接。在标准环境中,这个模块会向底层操作系统发起 POSIX 系统调用。而在 WebAssembly 沙箱内,这些 POSIX 网络系统调用通常只是总会失败的桩函数,任何打开标准套接字的尝试都会立即失败。为了解决这个问题,我们使用 Workers 的 connect API 实现了套接字系统调用。
当数据库驱动尝试打开 TCP 连接时,它会经过我们自定义的套接字系统调用实现。该实现把打开连接、读取字节等标准的 Python 套接字操作,转换为 Workers 运行时所使用的相应 JavaScript 调用。由于这种转换发生在系统调用层面,你的数据库驱动完全不需要了解底层实现。
正是这座套接字桥梁使我们的 Hyperdrive 集成成为可能。要在 Python Workers 中使用 Hyperdrive,首先用 Hyperdrive 连接你的数据库,并在 Wrangler 配置中设置绑定:
"hyperdrive": [
{
"binding": "HYPERDRIVE_MYSQL",
"id": "<example id: 57b7076f58be42419276f058a8968187>",
}
]
然后,使用你熟悉的数据库驱动连接 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()
你可以参阅 Hyperdrive Python Workers 文档,了解如何在 Python Workers 中使用 Hyperdrive,以及目前支持哪些包。
扩展 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 平台支持,方便其他人采用对 PyEmscripten 平台的支持。
虽然生态仍在逐步采用这一标准,但我们希望未来每个 Python 包都有一个可在 WebAssembly 上运行的 wheel。我们也在积极与主要的包维护者合作,添加 PyEmscripten 构建。如果你遇到尚不受支持的包,请在 Discord 或 GitHub 上告诉我们,我们的团队会设法将其构建出来。
你也可以观看我们的 EuroPython 2026 演讲:“Python Everywhere: The State of Python on WebAssembly”,了解我们是如何实现这一切的。
用 Python 构建 AI 智能体和流水线
数据科学和机器学习包的庞大生态,使 Python 成为构建智能体和 AI 流水线的自然之选。但要把这些带到 Python Workers 中,过去一直存在挑战:openai 和 langchain 等库依赖 requests 或 httpx 等 HTTP 客户端与外部 API 通信。然而,由于 Python Workers 缺少对底层套接字操作的支持,这些 HTTP 客户端无法正常工作。
为了解决这个问题,我们向上游贡献了代码,确保这些 HTTP 客户端在 WebAssembly 环境中可以把请求直接路由到 JavaScript 的 fetch API。再结合我们在上一节中介绍的对底层套接字操作的新支持,整个网络栈便能在 Python Workers 内无缝运行。
因此,你现在可以在 Python Workers 中原生运行 openai、langchain 和 mcp 等 AI 库。你还可以将它们与 Workers AI 结合,在 Cloudflare 网络的 GPU 上运行无服务器推理,或者通过 Cloudflare AI Gateway 代理请求。
下面的示例展示了如何使用 langchain-cloudflare 包在 langchain 中运行 Worker AI 模型:
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 存储桶中。

使用 Bluesky Jetstream 进行实时流处理
消费海量的实时事件流通常需要一台专用服务器来维持连接。在这个示例中,我们使用 一个 Python Worker 连接 ATProto/Bluesky Jetstream WebSocket。通过用 Durable Object 支撑这一连接,Python Worker 可以保持长期状态,确保 WebSocket 连接始终存活。

更多值得探索的示例
Model Context Protocol(MCP)服务器
使用官方 Python MCP 包构建并部署 MCP 服务器,让你的 AI 助手可以访问边缘数据。

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

Cloudflare 开发者文档中的 Python 代码示例
我们已更新各个 Cloudflare 产品的文档,加入了 Python 示例代码。几乎所有展示如何用 TypeScript 做某件事的代码示例旁,现在都有对应的 Python 示例。我们承诺会继续在所有产品中提供 Python 示例。在整个开发者文档中,你都可以在 JavaScript、TypeScript 和 Python 之间切换代码片段。

接下来是什么?
达到 GA 只是开始。我们有许多计划让 Python Workers 变得更好,包括提升 Python Workers 的性能和内存效率,以及支持更多的包。
请继续告诉我们你想在 Python Workers 上构建什么,我们也会不断突破可能性的边界。查看 Python Workers 文档,开始构建你的第一个 Python Worker 吧!
