Python Workers 正式 GA:把 FastAPI 带到 Cloudflare 边缘,不再手搓适配层

2026-09-22 20 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

Cloudflare Python Workers 正式进入 GA,变化不只是“现在可以用 Python 写一个边缘函数”。更关键的是,Python 已经接入 Workers 的完整平台能力:FastAPI、Django、Flask 可以沿用熟悉的框架结构,应用也能通过绑定访问 Workers AI、R2、D1、Hyperdrive、Durable Objects、Queues 和 Workflows。

对于已有 Python 服务的团队,这意味着迁移重点从“如何把请求翻译成 Worker 能理解的格式”,转向“哪些依赖和运行时假设适合边缘环境”。

GA 真正解决了什么

过去把 Python Web 应用放到非传统服务器环境,往往要维护一层胶水代码:解析平台事件、构造框架请求对象、转换响应,再单独处理数据库和对象存储凭证。

Python Workers 将这部分职责收进运行时和框架适配层。以 FastAPI 为例,应用仍然定义路由、路径参数和响应模型,Worker 入口只需要把请求交给 ASGI 适配器:

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

这里的 self.env 是平台绑定入口。应用不必自己读取 R2、D1 等服务的访问密钥,也不必通过公网 HTTP 绕一圈访问同一平台上的资源。

底层仍不是一台持续运行的传统 Python 服务器。Python Workers 基于 Workers 隔离环境运行 Python,技术路径与 Pyodide、WebAssembly 和 V8 isolate 有关。因此,“支持 Python”不等于“拥有一台可以任意启动进程、写本地磁盘或安装系统动态库的 Linux 主机”。GA 提升的是可用性、兼容性和平台承诺,并没有抹平边缘运行时与服务器之间的差异。

用 FastAPI 跑起一个最小 Worker

下面是一套可以直接创建并改造的最小项目。运行前需要安装 Node.js,并准备一个 Cloudflare 账号;本地开发可以先不登录。

mkdir fastapi-edge-api
cd fastapi-edge-api

npm init -y
npm install --save-dev wrangler
mkdir -p src

cat > wrangler.jsonc <<'EOF'
{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "fastapi-edge-api",
  "main": "src/entry.py",
  "compatibility_date": "2024-03-20",
  "compatibility_flags": ["python_workers"]
}
EOF

cat > requirements.txt <<'EOF'
fastapi
EOF

cat > src/entry.py <<'EOF'
from fastapi import FastAPI
from workers import WorkerEntrypoint
import asgi

app = FastAPI(title="Edge Catalog API")


@app.get("/")
async def root():
    return {
        "service": "fastapi-edge-api",
        "runtime": "cloudflare-workers",
    }


@app.get("/products/{product_id}")
async def get_product(product_id: int, currency: str = "CNY"):
    return {
        "id": product_id,
        "currency": currency,
        "available": True,
    }


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

npm pkg set scripts.dev="wrangler dev"
npm pkg set scripts.deploy="wrangler deploy"
npm run dev

开发服务器启动后,可以在另一个终端验证路由:

curl http://localhost:8787/
curl 'http://localhost:8787/products/42?currency=USD'

准备部署时执行:

npx wrangler login
npm run deploy

这个例子保留了 FastAPI 最常用的开发方式。继续加入 Pydantic 模型、中间件和路由拆分时,仍然按照普通 FastAPI 项目组织即可。Django 的 ASGI 入口和 Flask 的 WSGI 应用也可以采用类似思路,但具体适配器和项目启动方式应以当前 Workers 工具链版本为准。

平台绑定比“能跑框架”更重要

框架兼容解决的是 HTTP 层,而绑定决定应用能否真正利用 Cloudflare 平台。比如,可以先创建 R2 存储桶和 D1 数据库:

npx wrangler r2 bucket create edge-uploads
npx wrangler d1 create edge-app-db

然后在 wrangler.jsonc 中加入对应配置。D1 创建命令会返回真实的 database_id,需要替换下面的占位值:

{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "fastapi-edge-api",
  "main": "src/entry.py",
  "compatibility_date": "2024-03-20",
  "compatibility_flags": ["python_workers"],

  "r2_buckets": [
    {
      "binding": "UPLOADS",
      "bucket_name": "edge-uploads"
    }
  ],

  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "edge-app-db",
      "database_id": "替换为-d1-命令返回的-id"
    }
  ]
}

运行时会通过 self.env.UPLOADSself.env.DB 暴露这些资源。相同的绑定模型也覆盖 Workers AI、Hyperdrive、Durable Objects、Queues 和 Workflows。它带来两个直接收益:

  • 代码中不再保存长期云服务密钥,资源访问关系由部署配置声明。
  • 本地、预发布和生产环境可以绑定不同资源,而不必修改业务模块。

不过,绑定名称仍然属于应用接口。建议集中封装数据访问逻辑,不要让每个路由都直接操作 self.env,否则测试和后续迁移会变得困难。

迁移前先检查运行时假设

“FastAPI、Django、Flask 能运行”不代表任意现有项目都能原封不动部署。上线前至少检查以下项目:

  • 原生扩展:依赖系统动态库、特定 CPU 指令或编译型扩展的 Python 包,需要确认 Workers/Pyodide 环境是否支持。
  • 本地文件系统:不要把上传文件、SQLite 数据库或生成结果长期保存在本地路径;持久数据应进入 R2、D1 或其他外部存储。
  • 后台进程:依赖 subprocess、守护线程、Celery worker 或常驻进程的设计不能直接照搬,可考虑 Queues 和 Workflows。
  • 数据库连接:传统 ORM 可能假设存在普通 TCP 连接和长期连接池。迁移时要评估 D1、Hyperdrive以及所用数据库驱动的兼容性。
  • 全局状态:普通 Worker 实例的内存不是可靠的持久状态;需要一致性和协调能力时,应明确使用 Durable Objects。
  • 依赖体积与启动成本:只保留请求路径真正需要的包,避免把数据科学工具链或大型模型一并打入简单 API。

比较稳妥的采用路径是:先迁移一个无状态、依赖较少的查询接口,再接入一个平台绑定,观察日志、延迟、异常率和依赖兼容性。确认运行模型后,再处理 ORM、后台任务和有状态工作流。

Python Workers GA 的价值,不是让边缘运行时伪装成传统服务器,而是让 Python 开发者使用熟悉的框架进入 Workers 平台。框架层的胶水代码正在消失,但运行时边界依旧存在。理解这些边界,才能把 FastAPI 或 Django 真正变成边缘应用,而不是把一台服务器的假设硬塞进 isolate。


相关推荐