Python Workers では Flask ↗ を使えます。
Flask アプリケーションは、Web Server Gateway Interface(WSGI)というプロトコルに依存します。そのため Flask はソケットを直接読み書きせず、通信は WSGI サーバーに任せます。
Python Workers には WSGI サーバー ↗ が含まれており、Flask アプリケーションで使えます。
次のクイックスタートで、最小構成の Flask アプリケーションを動かします。
-
Flask アプリケーションを書いた
src/worker.pyを作成します。src/worker.pypython from flask import Flask from workers import wsgi app = Flask(__name__) @app.get("/") def index(): return {"message": "Hello from Flask"} Default = wsgi.entrypoint(app) -
プロジェクトルートに
wrangler.jsoncを作成します。{ "$schema": "node_modules/wrangler/config-schema.json", "name": "my-flask-worker", "main": "src/worker.py", // Set this to today's date "compatibility_date": "2026-09-20", "compatibility_flags": ["python_workers"] }"$schema" = "node_modules/wrangler/config-schema.json" name = "my-flask-worker" main = "src/worker.py" # Set this to today's date compatibility_date = "2026-09-20" compatibility_flags = [ "python_workers" ] -
依存関係を宣言する
pyproject.tomlを作成します。pyproject.tomltoml [project] name = "flask-worker" version = "0.1.0" requires-python = ">=3.12" dependencies = [ "flask", ] [dependency-groups] dev = [ "workers-py", "workers-runtime-sdk", ] -
ローカル開発サーバーを起動します。
uv run pywrangler dev -
別のターミナルで、Worker にリクエストを送ります。
curl http://localhost:8787/Worker は次を返します。
{"message":"Hello from Flask"}
Flask バックエンドとあわせて、任意の静的フロントエンドを Workers Static Assets で配信できます。 Static Assets を使うと、フロントエンドファイルは Worker 本体にバンドルされないため、バンドルを小さく保てます。
静的ファイルは ./public/ などのディレクトリに置きます。続けて Wrangler ファイルに、binding を含み run_worker_first を true にした assets ブロックを設定します。こうすると、すべてのリクエストが先に Flask Worker に届くため、API ルートが静的ファイルより優先されます。
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "my-flask-worker",
"main": "src/worker.py",
// Set this to today's date
"compatibility_date": "2026-09-20",
"compatibility_flags": ["python_workers"],
"assets": {
"directory": "./public/",
"binding": "ASSETS",
"run_worker_first": true
}
}"$schema" = "node_modules/wrangler/config-schema.json"
name = "my-flask-worker"
main = "src/worker.py"
# Set this to today's date
compatibility_date = "2026-09-20"
compatibility_flags = [ "python_workers" ]
[assets]
directory = "./public/"
binding = "ASSETS"
run_worker_first = true次の Worker は、先に API ルートを処理し、それ以外のリクエストを転送します。キャッチオールハンドラーは、各アセットの本文、ステータス、ヘッダーを返します。
from flask import Flask, Response, request
from pyodide.ffi import run_sync
from workers import wsgi
app = Flask(__name__)
@app.get("/api/hello")
def api_hello():
return {"message": "Hello from the API"}
@app.get("/")
@app.get("/<path:path>")
def frontend(path=""):
assets = request.environ["workers.env"].ASSETS
asset_response = run_sync(assets.fetch(f"https://assets.local/{path}"))
body = run_sync(asset_response.bytes())
return Response(
body,
status=asset_response.status,
headers=asset_response.headers,
)
Default = wsgi.entrypoint(app)run_sync は、非同期のアセット操作を Flask の同期ハンドラーにつなぎます。API ルートが優先され、一致しないパスは ./public/ から配信されます。
cloudflare/python-workers-examples リポジトリをクローンし、そこに含まれる flask-todo の例を実行します。
git clone https://github.com/cloudflare/python-workers-examples
cd python-workers-examples/flask-todo
# See README.md for instructions