Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Flask

最終更新 Markdown で表示Agent セットアップ

Python Workers では Flask を使えます。

Flask アプリケーションは、Web Server Gateway Interface(WSGI)というプロトコルに依存します。そのため Flask はソケットを直接読み書きせず、通信は WSGI サーバーに任せます。

Python Workers には WSGI サーバー が含まれており、Flask アプリケーションで使えます。

Flask Worker を作成する

次のクイックスタートで、最小構成の Flask アプリケーションを動かします。

  1. 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)
  2. プロジェクトルートに 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" ]
  3. 依存関係を宣言する 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",
    ]
  4. ローカル開発サーバーを起動します。

    uv run pywrangler dev
  5. 別のターミナルで、Worker にリクエストを送ります。

    curl http://localhost:8787/

    Worker は次を返します。

    {"message":"Hello from Flask"}

フロントエンドを配信する

Flask バックエンドとあわせて、任意の静的フロントエンドを Workers Static Assets で配信できます。 Static Assets を使うと、フロントエンドファイルは Worker 本体にバンドルされないため、バンドルを小さく保てます。

静的ファイルは ./public/ などのディレクトリに置きます。続けて Wrangler ファイルに、binding を含み run_worker_firsttrue にした 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 ルートを処理し、それ以外のリクエストを転送します。キャッチオールハンドラーは、各アセットの本文、ステータス、ヘッダーを返します。

src/worker.pypython
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

役に立ちましたか?