コンテンツにスキップ

Python

ベータ

Cloudflare Workersは、以下を含むPythonのファーストクラスサポートを提供します。

始める

Terminal window
git clone https://github.com/cloudflare/python-workers-examples
cd python-workers-examples/01-hello
npx wrangler@latest dev

Python Workerは、3行のコードで非常にシンプルにできます。

from js import Response
def on_fetch(request):
return Response.new("Hello World!")

JavaScriptTypeScript、またはRustで書かれたWorkersと同様に、Python Workerのメインエントリポイントはfetchハンドラです。Python Workerでは、このハンドラはon_fetchと呼ばれます。

ローカルでPython Workerを実行するには、Cloudflare WorkersのCLIであるWranglerを使用します。

Terminal window
npx wrangler@latest dev

Python WorkerをCloudflareにデプロイするには、wrangler deployを実行します。

Terminal window
npx wrangler@latest deploy

モジュール

Python Workersは複数のファイルに分割できます。新しいPythonファイルsrc/hello.pyを作成しましょう。

def hello(name):
return "Hello, " + name + "!"

次に、src/entry.pyを修正して新しいモジュールを利用します。

from hello import hello
from js import Response
def on_fetch(request):
return Response.new(hello("World"))

src/entry.pyを編集すると、Wranglerは自動的に変更を検出し、Workerを再読み込みします。

Requestインターフェース

fetchハンドラに渡されるrequestパラメータは、外部関数インターフェースを介して公開されたJavaScriptのRequestオブジェクトであり、Pythonコードから直接アクセスできます。

POSTリクエストを受け入れるようにWorkerを編集してみましょう。Requestに関するドキュメントから、async関数内でawait request.json()を呼び出してリクエストボディをJSONとして解析できることがわかります。Python Workerでは、次のように書きます。

from js import Response
from hello import hello
async def on_fetch(request):
name = (await request.json()).name
return Response.new(hello(name))

src/entry.pyを編集すると、Wranglerはローカル開発サーバーを自動的に再起動します。適切なボディを持つPOSTリクエストを送信すると、Workerはパーソナライズされたメッセージで応答します。

Terminal window
curl --header "Content-Type: application/json" \
--request POST \
--data '{"name": "Python"}' http://localhost:8787
Hello, Python!

envパラメータ

requestパラメータに加えて、envパラメータもPythonのfetchハンドラに渡され、環境変数シークレット、およびバインディングにアクセスするために使用できます。

例えば、Python Workerで環境変数を設定して使用してみましょう。まず、Workerのwrangler.tomlに環境変数を追加します。

name = "hello-python-worker"
main = "src/entry.py"
compatibility_flags = ["python_workers"]
compatibility_date = "2024-03-20"
[vars]
API_HOST = "example.com"

次に、envパラメータを介してAPI_HOST環境変数にアクセスできます。

from js import Response
async def on_fetch(request, env):
return Response.new(env.API_HOST)

さらなる学び