Foreign Function Interface (FFI)
Via Pyodide, Python Workers provide a Foreign Function Interface (FFI) to JavaScript. This allows you to:
- Use bindings to resources on Cloudflare, including Workers AI, Vectorize, R2, KV, D1, Queues, Durable Objects, Service Bindings and more.
- Use JavaScript globals, like
Request
,Response
, andfetch()
. - Use the full feature set of Cloudflare Workers — if an API is accessible in JavaScript, you can also access it in a Python Worker, writing exclusively Python code.
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
:
wrangler.tomlmain = "./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
:
index.pyfrom 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:
index.pyfrom 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.