Skip to content

Foreign Function Interface (FFI)

Via Pyodide, Python Workers provide a Foreign Function Interface (FFI) to JavaScript. This allows you to:

The details of Pyodide’s Foreign Function Interface are documented here, and Workers written in Python are able to take full advantage of this.

Using Bindings from Python Workers

Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an R2 bucket.

For example, to access a KV namespace from a Python Worker, you would declare the following in your Worker’s wrangler.toml:

main = "./src/index.py"
kv_namespaces = [
{ binding = "FOO", id = "<YOUR_KV_NAMESPACE_ID>" }
]

…and then call .get() on the binding object that is exposed on env:

from js import Response
async def on_fetch(request, env):
await env.FOO.put("bar", "baz")
bar = await env.FOO.get("bar")
return Response.new(bar) # returns "baz"

Under the hood, env is actually a JavaScript object. When you call .FOO, you are accessing this property via a JsProxy — special proxy object that makes a JavaScript object behave like a Python object.

Using JavaScript globals from Python Workers

When writing Workers in Python, you can access JavaScript globals by importing them from the js module. For example, note how Response is imported from js in the example below:

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

Refer to the Python examples to learn how to call into JavaScript functions from Python, including console.log and logging, providing options to Response, and parsing JSON.