The Basics
As mentioned in the introduction to Python Workers, a Python Worker can be as simple as four lines of code:
from workers import WorkerEntrypoint, Response
class Default(WorkerEntrypoint): async def fetch(self, request): return Response("Hello World!")Similar to other Workers, the main entry point for a Python worker is the fetch handler which handles incoming requests
sent to the Worker.
In a Python Worker, this handler is placed in a Default class that extends the WorkerEntrypoint class (which you can import from the workers SDK module).
The request parameter passed to your fetch handler is a JavaScript Request object, exposed via the foreign function interface (FFI),
allowing you to access it directly from your Python code.
Let's try editing the worker to accept a POST request. We know from the
documentation for Request that we can call
await request.json() within an async function to parse the request body as
JSON.
In a Python Worker, you would write:
from workers import WorkerEntrypoint, Responsefrom hello import hello
class Default(WorkerEntrypoint): async def fetch(self, request): name = (await request.json()).name return Response(hello(name))Many other JavaScript APIs are available in Python Workers via the FFI, so you can call other methods in a similar way.
Once you edit the src/entry.py, Wrangler will automatically restart the local
development server.
Now, if you send a POST request with the appropriate body, your Worker will respond with a personalized message.
curl --header "Content-Type: application/json" \ --request POST \ --data '{"name": "Python"}' http://localhost:8787Hello, Python!The env attribute on the WorkerEntrypoint can be used to access
environment variables,
secrets,and
bindings.
For example, let us try setting and using an environment variable in a Python Worker. First, add the environment variable to your Worker's Wrangler configuration file:
{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "hello-python-worker", "main": "src/entry.py", "compatibility_flags": [ "python_workers" ], "compatibility_date": "2025-11-02", "vars": { "API_HOST": "example.com" }}name = "hello-python-worker"main = "src/entry.py"compatibility_flags = ["python_workers"]compatibility_date = "2025-11-02"
[vars]API_HOST = "example.com"Then, you can access the API_HOST environment variable via the env parameter:
from workers import WorkerEntrypoint, Response
class Default(WorkerEntrypoint): async def fetch(self, request): return Response(self.env.API_HOST)Python workers can be split across multiple files.
Let's create a new Python file, called src/hello.py:
def hello(name): return "Hello, " + name + "!"Now, we can modify src/entry.py to make use of the new module.
from hello import hellofrom workers import WorkerEntrypoint, Response
class Default(WorkerEntrypoint): async def fetch(self, request): return Response(hello("World"))Once you edit src/entry.py, pywrangler will automatically detect the change and
reload your Worker.
When developing Python Workers, you can take advantage of type hints and autocompletion in your IDE.
To enable them, install the workers-runtime-sdk package in your pyproject.toml file.
[dependency-groups]dev = [ "workers-py", "workers-runtime-sdk"]Additionally, you can generate types based on your Worker configuration using uv run pywrangler types
This includes Env types based on your bindings, module rules, and runtime types based on the compatibility_date and compatibility_flags in your config file.
To upgrade to the latest version of pywrangler globally, run the following command:
uv tool upgrade workers-pyTo upgrade to the latest version of pywrangler in a specific project, run the following command:
uv lock --upgrade-package workers-py- Learn details about local development, deployment, and how Python Workers work.
- Explore the package docs for instructions on how to use packages with Python Workers.
- Understand which parts of the Python Standard Library are supported in Python Workers.
- Learn about Python Workers' foreign function interface (FFI), and how to use it to work with bindings and Runtime APIs.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark
-