Python Workers 现已正式发布

两年前,我们推出了 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 框架。你甚至可以使用动态 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 解释器的完美环境。通过使用
,我们得以在 Cloudflare Workers 中快速支持广泛的 Python 应用。
__Pyodide__我们的目标是创建首个可无限扩展的 Python 应用平台,同时让开发体验与其他地方的 Python 应用一样简单高效。
我们今天重点介绍的功能是这项多年努力的成果。许多开发者已经在 Python Workers 中构建应用;今天,我们正将这些能力推向生产就绪,供所有人使用。
Python 现已成为 Cloudflare Workers 运行时的一等语言
Python Workers 现在原生支持 Cloudflare 开发者平台绑定。此前,在 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 中。这让你能够以 Pythonic 的方式使用所有 Cloudflare 绑定,而无需编写一行 JavaScript 代码,使以下内容直接可用:
self.env.QUEUE.send({"key": "value"})
Web 框架:FastAPI、Django 和 Flask
现在,你可以运行你喜欢的 Python 框架,例如 FastAPI、Django 或 Flask,在 Python Workers 中构建 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 服务器网关接口(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 Workers 文档 中找到有关使用每个 Web 框架的更多信息。
将 PostgreSQL 和 MySQL 与 Hyperdrive 结合使用
如果你正在使用 PostgreSQL 或 MySQL 等关系数据库构建 Python 应用程序,现在可以将 Hyperdrive 集成到 Python Workers 中。
此前,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 平台构建包。此外,我们为 添加了 PyEmscripten 平台支持,以便其他人更容易采用对 PyEmscripten 平台的支持。
cibuildwheel
虽然生态系统仍在采用这一标准,但我们希望未来每个 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 中无缝工作。
因此,你现在可以运行像 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 存储桶。

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

更多示例供探索
模型上下文协议 (MCP) 服务器
构建并部署一个 MCP 服务器,使用官方 Python MCP 包,让你的 AI 助手能够访问边缘数据。

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

Cloudflare 开发者文档中的 Python 代码示例
我们更新了 Cloudflare 产品文档,加入了 Python 示例代码。几乎在所有展示如何用 TypeScript 做某事的代码示例处,也都有对应的 Python 代码示例。我们致力于继续在所有产品中包含 Python 示例。你可以在我们的开发者文档中在 JavaScript、TypeScript 和 Python 之间切换代码片段。

下一步是什么?
达到 GA 只是开始。我们有许多计划来改进 Python Workers,包括提高 Python Workers 的性能和内存效率,以及支持更多包。
继续告诉我们你想在 Python Workers 上构建什么,我们将继续突破可能的边界。查看 Python Workers 文档 并开始构建你的第一个 Python Worker!
