Cloudflare Python Workers Chính Thức GA: Deploy FastAPI Trên Edge Không Cần JavaScript Từ A Đến Z

Cloudflare Python Workers chạy FastAPI trên edge

Ngày 21/9/2026 vừa qua, Cloudflare tuyên bố Python Workers chính thức đạt trạng thái General Availability (GA). Sau hai năm thử nghiệm, Python nay trở thành ngôn ngữ hàng đầu (first-class) trên nền tảng Cloudflare Workers: bạn chạy FastAPI, Django, Flask nguyên bản, kết nối D1, R2, Hyperdrive, Workers AI mà không phải viết một dòng JavaScript nào. Trong bài này mình sẽ hướng dẫn bạn deploy một API FastAPI lên Cloudflare Workers từ A đến Z, kèm cách nối database MySQL/PostgreSQL qua Hyperdrive và chạy AI pipeline bằng langchain.

Python Workers GA nghĩa là gì và tại sao bạn nên quan tâm?

Cloudflare Python Workers chạy FastAPI trên edge
Cloudflare Python Workers GA cho phép deploy FastAPI lên edge không cần JavaScript

Python Workers cho phép chạy code Python trực tiếp trong runtime Workers của Cloudflare, nhờ trình thông dịch Python biên dịch sang WebAssembly (Pyodide). Trước đây đây chỉ là tính năng thử nghiệm, giờ đã production-ready: bindings của Cloudflare được hỗ trợ tự nhiên, web framework chạy được, và thư viện AI như openai hay langchain hoạt động nguyên bản. Với ai đang thuê VPS chạy API Python, đây là phương án serverless tiết kiệm và tự scale theo traffic.

Trước và sau GA: glue code JavaScript đã biến mất đi đâu?

Điểm mình thích nhất ở bản GA là RPC boundary đã được làm sạch. Trước đây, gửi một dictionary Python vào Cloudflare Queue bạn phải viết:

from pyodide.ffi import to_js
import js

self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))

Giờ chỉ còn:

self.env.QUEUE.send({"key": "value"})

Toàn bộ quá trình chuyển đổi kiểu được đóng gói bên trong runtime và Python SDK. Code sạch hơn, ít lỗi hơn, đặc biệt khi bạn dùng AI agent viết code thay mình.

Bước 1: Cài Wrangler và tạo project Python Worker như thế nào?

Bạn cần Node.js bản 18 trở lên và tài khoản Cloudflare miễn phí. Cài công cụ CLI Wrangler rồi tạo project mới:

npm install -g wrangler
wrangler init my-python-api --language python
cd my-python-api

Wrangler sẽ sinh sẵn file main.py và wrangler.jsonc. Mở wrangler.jsonc và khai báo binding AI để dùng Workers AI ở bước sau:

{
  "name": "my-python-api",
  "main": "src/main.py",
  "compatibility_date": "2026-09-21",
  "ai": { "binding": "AI" }
}

Bước 2: Viết API FastAPI chạy trên Workers ra sao?

Cài FastAPI vào requirements của project, rồi viết app gần giống hệt app FastAPI truyền thống:

from fastapi import FastAPI, Request
from workers import asgi, WorkerEntrypoint

app = FastAPI()

@app.get("/")
async def root(request: Request):
    env = request.scope["env"]
    result = 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?",
        },
    )
    return {"result": result["response"]}

Default = asgi.entrypoint(app)

Điểm khác biệt duy nhất so với bản chạy uvicorn: dòng Default = asgi.entrypoint(app). Package workers.asgi đóng vai cầu nối, translate request của Workers thành chuẩn ASGI mà FastAPI hiểu. Với Django hoặc Flask (đồng bộ), bạn dùng workers.wsgi tương tự:

from workers import wsgi
from your_django_app.wsgi import app

Default = wsgi.entrypoint(app)

Bước 3: Deploy và test thử API trong bao lâu?

Chỉ một lệnh, mất chưa đến một phút:

wrangler deploy

Sau khi deploy xong, Wrangler in ra URL dạng https://my-python-api.<tên-tài-khoản>.workers.dev. Test ngay:

curl https://my-python-api.yourname.workers.dev/

Nếu nhận về JSON chứa câu trả lời của model, chúc mừng, bạn vừa chạy FastAPI plus AI inference trên edge không cần một server nào. Muốn test local trước, dùng wrangler dev.

Nối database MySQL và PostgreSQL bằng Hyperdrive như thế nào?

Đây là phần đắt giá nhất của bản GA. Trước đây, sandbox WebAssembly chặn hoàn toàn socket nên asyncpg hay aiomysql không chạy được. Cloudflare đã hiện thực socket syscall qua Workers connect API, nhờ vậy driver kết nối như thường. Cấu hình Hyperdrive trong wrangler.jsonc:

"hyperdrive": [
    {
        "binding": "HYPERDRIVE_MYSQL",
        "id": "<hyperdrive-id>"
    }
]

Rồi kết nối bằng aiomysql quen thuộc:

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")
        rows = await cur.fetchall()
        await cur.close()
        conn.close()
        return __import__("workers").Response.json({"users": rows})

Hyperdrive còn cache query và giữ connection pool gần người dùng, giảm latency xuống đáng kể so với chạy API Python ở một VPS duy nhất.

Chạy AI agent bằng langchain trên Workers có khó không?

Hoàn toàn không. Các HTTP client như requests, httpx đã được contribute upstream để route qua fetch API trong môi trường WebAssembly, nên openai, langchain, mcp chạy nguyên bản. Ví dụ chạy chain langchain với model của Workers 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})

Cloudflare cũng công bố kho mẫu python-workers-examples trên GitHub với các pattern production-ready: MCP server, RAG với Vectorize, pipeline AI bất đồng bộ dùng Queues cộng Workflows cộng R2, thậm chí consumer WebSocket gắn Durable Object.

Giới hạn nào cần biết trước khi đưa lên production?

Mình dong dài ưu điểm rồi, giờ nói hạn chế cho công bằng. Thứ nhất, package có native extension (C/C++/Rust) phải cross-compile sang WebAssembly. Cloudflare đẩy chuẩn PEP 783 PyEmscripten được Python chấp nhận, cộng hỗ trợ trong cibuildwheel, nhưng hệ sinh thái vẫn đang chuyển đổi, tức là một số package bạn cần có thể chưa có wheel tương thích. Thứ hai, Workers có giới hạn CPU time và memory per request, không phù hợp job nặng dài hạn. Thứ ba, cold start với Python-Wasm hiện vẫn cao hơn TypeScript, dù đang được cải thiện. Với API nhẹ và AI orchestration thì các giới hạn này hiếm khi là vấn đề.

Nên dùng Python Workers thay VPS Python khi nào?

Câu trả lời của mình: dùng khi ứng dụng là API hoặc worker kiểu event-driven, traffic dao động, và bạn muốn giảm chi phí vận hành. Giữ VPS khi bạn cần process dài, cron job nặng, hoặc phụ thuộc package chưa compile được sang Wasm. Lưu ý thêm: nếu website chính của bạn là WordPress thì Python Workers không thay thế nó, nhưng rất hợp làm layer API riêng, ví dụ endpoint AI cho plugin, mình từng viết về cách viết plugin tạo ảnh AI trong Media Library và quản lý WordPress bằng ChatGPT và Claude, hai bài đó đều có thể đổi backend API sang Python Workers. Nếu bạn đã dùng edge của Cloudflare cho WordPress như mình hướng dẫn trong bài bật Brotli thì việc thêm một Python Worker vào cùng tài khoản càng thuận tiện.

Kết luận: mình đánh giá sao bản GA này?

Sau khi tự tay deploy thử, mình đánh giá Python Workers GA là bước tiến lớn nhất của serverless Python kể từ đâu đến giờ. Glue code biến mất, framework quen thuộc chạy nguyên bản, database nối được qua Hyperdrive, và stack AI chạy thẳng trên edge. Nếu bạn có ý tưởng API nhỏ hoặc AI agent cần chạy rẻ và bền, dành một buổi tối làm theo các bước trên là đáng giá. Lộ trình của Cloudflare còn hứa cải thiện hiệu năng và mở rộng package, nên đây là đúng lúc bắt đầu.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *