Pyodide ↗ 経由で、Python Workers は JavaScript への 外部関数インターフェイス(FFI) ↗ を提供します。これにより、次ができます。
- Workers AI、Vectorize、R2、KV、D1、Queues、Durable Objects、サービスバインディング などを含む、Cloudflare 上のリソースへの バインディング を使う。
Request、Response、fetch()などの JavaScript グローバルを使う。- Cloudflare Workers の機能一式を使う — JavaScript で使える API は、Python だけを書いて Python Worker からも使えます。
Pyodide の外部関数インターフェイスの詳細は こちら ↗ にあります。Python で書いた Worker は、これをフルに使えます。
バインディングを使うと、Worker は Cloudflare Developer Platform 上のリソースとやり取りできます。Worker にバインディングを宣言すると、R2 バケットへのファイルの読み書きなど、特定の能力を与えます。
たとえば Python Worker から KV 名前空間にアクセスするには、Worker の Wrangler 設定ファイル で次のように宣言します。
{
"main": "./src/index.py",
"kv_namespaces": [
{
"binding": "FOO",
"id": "<YOUR_KV_NAMESPACE_ID>"
}
]
}main = "./src/index.py"
[[kv_namespaces]]
binding = "FOO"
id = "<YOUR_KV_NAMESPACE_ID>"...そのうえで、env に公開されるバインディングオブジェクトの .get() を呼び出します。
from workers import WorkerEntrypoint, Response
class Default(WorkerEntrypoint):
async def fetch(self, request):
await self.env.FOO.put("bar", "baz")
bar = await self.env.FOO.get("bar")
return Response(bar) # returns "baz"JavaScript API と連携するために、Python オブジェクトを JavaScript に変換する必要があることがあります。Pyodide は、この変換のために to_js 関数を提供します。
from js import Object
from pyodide.ffi import to_js as _to_js
from workers import WorkerEntrypoint, Response
# to_js converts between Python dictionaries and JavaScript Objects
def to_js(obj):
return _to_js(obj, dict_converter=Object.fromEntries)詳細は pyodide.ffi.to_js のドキュメント ↗ を参照してください。
JavaScript グローバルには、workers-runtime-sdk パッケージが提供する workers モジュールを使い、より Python らしい方法でアクセスすることを推奨します。
ただし、何らかの理由で JavaScript グローバルに直接アクセスする必要がある場合は、js モジュールからインポートできます。
たとえば、次の例では Response を js からインポートしています。
from workers import WorkerEntrypoint
from js import Response
class Default(WorkerEntrypoint):
async def fetch(self, request):
return Response.new("Hello World!")console.log とログ出力、Response へのオプション指定、JSON のパースなど、Python から JavaScript 関数を呼び出す方法は、Python の例 を参照してください。