Python Workers 现已正式发布
摘要
Cloudflare 宣布 Python Workers 正式发布,使其成为其 Developer Platform 上的一流语言,并支持 FastAPI、Django 和 Flask 等框架。
暂无内容
查看缓存全文
缓存时间: 2026/09/21 18:43
# Python Workers现已正式发布
来源:https://blog.cloudflare.com/python-workers-ga/
两年前,我们推出了Python Workers,为在Cloudflare Workers运行环境中运行Python应用程序(https://blog.cloudflare.com/python-workers/)提供了途径。我们的目标是让使用Python编写Workers与使用TypeScript一样简单,并让Python的包和生态系统能够“开箱即用”。如今,Python Workers已正式发布(GA)。
GA意味着什么?这意味着Python现已成为Cloudflare开发者平台上的首类、完全支持的语言。您可以带来熟悉的Python代码、库和设计模式,并将其与Workers AI、R2、D1、Hyperdrive、持久对象、队列、工作流以及Cloudflare平台的其余部分无缝连接。您还可以在Python Workers内运行流行的Python框架,如FastAPI、Django和Flask。甚至可以使用动态Workers(https://blog.cloudflare.com/dynamic-workers/)在另一个Worker内部创建Python Worker。
```python
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(https://blog.cloudflare.com/webassembly-on-cloudflare-workers/),这为我们提供了一个完美的环境来运行Wasm编译的Python解释器。通过使用Pyodide(https://pyodide.org/en/stable/),我们能够快速在Cloudflare Workers中支持广泛的Python应用程序。我们的目标是创建一个首个支持无限扩展Python应用程序的平台,同时使其开发体验与其他任何地方一样简单高效。今天我们所强调的功能正是这一多年努力的成果。许多开发者已经在Python Workers中构建应用程序;今天,我们将这些能力正式推向生产环境。
## Python现已成为Cloudflare Workers运行时的首类语言
Python Workers现在原生支持Cloudflare开发者平台的绑定。之前,在Python Workers中使用这些Cloudflare绑定需要在RPC边界处显式地将Python对象转换为TypeScript对象。例如,向Cloudflare队列发送Python字典需要以下粘合代码才能工作:
```python
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中封装了整个类型转换过程(https://blog.cloudflare.com/python-workers-rpc/)。这使您能够以Pythonic的方式使用所有Cloudflare绑定,而无需编写一行JavaScript代码,从而让以下代码直接工作:
```python
self.env.QUEUE.send({"key": "value"})
```
## Web框架:FastAPI、Django 和 Flask
现在您可以在Python Workers中运行喜爱的Python框架,如FastAPI、Django或Flask,来构建API服务器。我们实现了一个内置连接器,您可以使用它轻松将Web应用程序连接到Python Workers。假设您有一个简单的FastAPI Web应用程序:
```python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
message = "Hello, world!"
return {"message": message}
```
在原生环境中,您会使用像`uvicorn`这样的Web服务器来运行此应用程序。在Python Workers中,您可以使用我们提供的`workers.asgi`包来运行相同的应用程序,只需将以下代码片段添加到您的代码中:
```python
from workers import asgi
class Default(WorkerEntrypoint):
async def fetch(self, request):
return await asgi.fetch(app, request, self.env)
# 或等效地
Default = asgi.entrypoint(app)
```
类似地,您可以使用`workers.wsgi`包来运行同步的Web应用程序,如Django。
```python
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(https://peps.python.org/pep-3333/)或ASGI(https://asgi.readthedocs.io/en/latest/)接口的Python Web框架。您可以在Python Workers文档(https://developers.cloudflare.com/workers/languages/python/packages/)中找到有关使用每个Web框架的更多信息。
## 使用Hyperdrive连接PostgreSQL和MySQL
如果您正在使用PostgreSQL或MySQL等关系型数据库构建Python应用程序,现在可以将Hyperdrive(https://developers.cloudflare.com/hyperdrive/)集成到Python Workers中。之前,Python Workers不支持TCP套接字,导致数据库驱动程序无法使用。要理解这为何是障碍,您需要了解WebAssembly的运行方式。像`aiomysql`或`asyncpg`这样的Python数据库驱动程序依赖于标准库的`socket`模块来建立连接。在标准环境中,该模块会向底层操作系统进行POSIX系统调用。在WebAssembly沙箱内,这些POSIX网络系统调用通常是始终失败的桩代码。任何尝试打开标准套接字的操作都会立即失败。为了解决这个问题,我们使用Workers的connect(https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/)API实现了套接字系统调用。当数据库驱动程序尝试打开TCP连接时,它会经过我们的自定义套接字系统调用实现。它将标准的Python套接字操作(如打开连接和读取字节)转换为Workers运行时使用的相应JavaScript调用。由于此转换发生在系统调用级别,您的数据库驱动程序完全无需了解底层实现。这个套接字桥接使得我们的Hyperdrive集成成为可能。要在Python Workers中使用Hyperdrive,首先使用Hyperdrive连接您的数据库,并在Wrangler配置中设置绑定:
```json
"hyperdrive": [
{
"binding": "HYPERDRIVE_MYSQL",
"id": "",
}
]
```
然后,使用您熟悉的数据库驱动程序连接到Hyperdrive:
```python
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文档(https://developers.cloudflare.com/hyperdrive/examples/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和整个基于WebAssembly的Python社区。为此,我们提出了PEP 783(https://peps.python.org/pep-0783/),该提案标准化了一个名为PyEmscripten的平台,用于在浏览器运行时中运行Python。经过一年多的讨论和完善,该提案被接受,使软件包维护者能够为PyEmscripten平台构建和发布包,并在所有实现PyEmscripten的环境中使用它们。我们还稳定了现有的Pyodide构建工具链,并将其演变为所有软件包维护者都可访问的形式,使开发者能够轻松地为PyEmscripten平台构建包。此外,我们在`cibuildwheel`(https://cibuildwheel.pypa.io/en/stable/)中添加了PyEmscripten平台支持,以便其他人更容易地采用对PyEmscripten平台的支持。虽然生态系统仍在采用这一标准,但我们希望未来每个Python包都有一个适用于WebAssembly的轮子。我们还在积极与主要软件包维护者合作,添加PyEmscripten构建。如果您遇到尚未支持的包,请在Discord或GitHub上告诉我们,我们的团队将努力使其构建成功。您也可以查看我们EuroPython 2026的演讲:“Python Everywhere: The State of Python on WebAssembly”(https://youtu.be/HklunTc9giA?si=wqeOjDl9qNe6qtB2),了解我们如何实现这一目标。
## 在Python中构建AI代理和管道
庞大的数据科学和机器学习包生态系统使得Python成为构建智能代理和AI管道的自然选择。但将它们引入Python Workers历来存在一个挑战:像`openai`和`langchain`这样的库依赖于`requests`或`httpx`等HTTP客户端来与外部API通信。然而,由于Python Workers中缺少底层套接字操作支持,这些HTTP客户端无法正常工作。为了解决这个问题,我们向上游贡献了代码,以确保这些HTTP客户端可以在WebAssembly环境中通过JavaScript的`fetch` API直接路由请求。结合我们在前一部分(https://blog.cloudflare.com/python-workers-ga/#using-postgresql-and-mysql-with-hyperdrive)中解释的对底层套接字操作的新支持,这使得整个网络协议栈在Python Workers内无缝工作。因此,您现在可以在Python Workers中原生运行像`openai`、`langchain`和`mcp`这样的AI库。您还可以将它们与Workers AI结合使用,在Cloudflare的网络上运行GPU上的无服务器推理,或通过Cloudflare AI网关代理请求。下面的示例展示了如何在langchain中运行Worker AI模型,使用了langchain-cloudflare(https://github.com/cloudflare/langchain-cloudflare)包:
```python
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(https://github.com/cloudflare/python-workers-examples)仓库中汇集了一系列生产就绪的模式。以下是将Python Workers与Cloudflare生态系统结合使用的一些方式。
### 异步AI编排
构建全栈AI应用程序通常意味着连接存储、队列和推理等多个服务。此示例(https://github.com/cloudflare/python-workers-examples/tree/main/image-redraw)展示了如何纯粹在Python Workers中构建AI驱动的图像到图像生成器。它接受用户请求,将其放入Cloudflare队列,并使用工作流通过Workers AI编排图像生成步骤,并将图像存储到R2存储桶中。
BLOG-3512 2.png
### 使用Bluesky Jetstream进行实时流处理
消费实时事件流通常需要专用服务器来维护连接。在此示例中,我们使用Python Worker连接到ATProto/Bluesky Jetstream WebSocket(https://github.com/cloudflare/python-workers-examples/tree/main/websocket-stream-consumer)。通过使用持久对象来支持此连接,Python Worker可以维护长时间存在的状态,确保WebSocket连接保持活跃。
BLOG-3512 3.png
### 更多示例供探索
#### 模型上下文协议(MCP)服务器
使用官方Python MCP包构建和部署MCP服务器(https://github.com/cloudflare/python-workers-examples/tree/main/mcp-server),让您的AI助手访问边缘数据。
BLOG-3512 4.png
#### 使用Vectorize的检索增强生成(RAG)系统
使用Workers AI和Cloudflare的向量数据库Vectorize构建RAG系统(https://github.com/cloudflare/python-workers-examples/tree/main/vectorize-rag)。
BLOG-3512 5.png
## Cloudflare开发者文档中的Python代码示例
我们已经更新了整个Cloudflare产品的文档,其中包含Python示例代码。几乎在所有展示TypeScript代码示例的地方,现在也有相应的Python代码示例。我们承诺在所有产品中持续包含Python示例。您可以在我们的开发者文档中随时在JavaScript、TypeScript和Python代码片段之间切换。
BLOG-3512 6.png
## 下一步计划?
达到GA只是个开始。我们有很多计划让Python Workers变得更好,包括提升Python Workers的性能和内存效率,以及支持更多的软件包。请继续告诉我们您想在Python Workers上构建什么,我们将持续推动可能性的边界。查看Python Workers文档(https://developers.cloudflare.com/workers/languages/python/),开始构建您的第一个Python Worker吧!
相似文章
Cloudflare Python Workers 现已全面可用
Cloudflare Python Workers 已正式发布,通过 WebAssembly 和 Pyodide,现在支持在其边缘网络上执行 Python 代码,此前经过两年的预览阶段。
@kentcdodds: 我尝试在Kody上运行Python,因为Cloudflare现在已经正式支持Python在Workers(以及动态Workers)中运行:h…
Kent Dodds尝试在Kody上运行Python,利用Cloudflare对Python在Workers中的正式支持,但由于启动时间慢,决定不实现该功能。
@akazwz_: Cloudflare Workers 迎来重大更新——无论是免费套餐还是付费套餐,部署 Workers 的大小限制都……
Cloudflare Workers 将免费与付费套餐的部署大小限制一并提升至 64 MB。
@dinasaur_404: Workers + Access 刚刚变得更好:在特定 Worker 上启用 Access(涵盖所有预览和/或生产域名……
Cloudflare 增强了 Workers + Access,允许用户在特定 Worker 上启用访问控制、设置账户范围的覆盖范围、通过 ctx.access 查看访问详情,并在本地开发中进行测试。
Workers Cache
Cloudflare 推出 Workers Cache,这是一种位于 Workers 前面的分层缓存,允许在不调用 Worker 的情况下提供缓存响应,从而减少 CPU 时间并提高性能。