diff --git a/src/content/docs/d1/examples/query-d1-from-python-workers.mdx b/src/content/docs/d1/examples/query-d1-from-python-workers.mdx index 712e9929c7d8a94..18a7b826c6108d1 100644 --- a/src/content/docs/d1/examples/query-d1-from-python-workers.mdx +++ b/src/content/docs/d1/examples/query-d1-from-python-workers.mdx @@ -81,7 +81,7 @@ The value of `binding` is how you will refer to your database from within your W To create a Python Worker, create an empty file at `src/entry.py`, matching the value of `main` in your Wrangler file with the contents below: ```python -from js import Response +from workers import Response async def on_fetch(request, env): # Do anything else you'd like on request here! diff --git a/src/content/docs/workers/examples/103-early-hints.mdx b/src/content/docs/workers/examples/103-early-hints.mdx index b0c0caf6ce04e9e..adcae028ab00206 100644 --- a/src/content/docs/workers/examples/103-early-hints.mdx +++ b/src/content/docs/workers/examples/103-early-hints.mdx @@ -111,7 +111,7 @@ export default { ```py import re -from js import Response, Headers +from workers import Response CSS = "body { color: red; }" HTML = """ @@ -129,11 +129,11 @@ HTML = """ """ def on_fetch(request): if re.search("test.css", request.url): - headers = Headers.new({"content-type": "text/css"}.items()) - return Response.new(CSS, headers=headers) + headers = {"content-type": "text/css"} + return Response(CSS, headers=headers) else: - headers = Headers.new({"content-type": "text/html","link": "; rel=preload; as=style"}.items()) - return Response.new(HTML, headers=headers) + headers = {"content-type": "text/html","link": "; rel=preload; as=style"} + return Response(HTML, headers=headers) ``` diff --git a/src/content/docs/workers/examples/ab-testing.mdx b/src/content/docs/workers/examples/ab-testing.mdx index fa1db299adb5c7c..3b71cca1afaeadf 100644 --- a/src/content/docs/workers/examples/ab-testing.mdx +++ b/src/content/docs/workers/examples/ab-testing.mdx @@ -100,7 +100,7 @@ export default { ```py import random from urllib.parse import urlparse, urlunparse -from js import Response, Headers, fetch +from workers import Response, fetch NAME = "myExampleWorkersABTest" @@ -132,8 +132,7 @@ async def on_fetch(request): res = await fetch(urlunparse(url)) headers = dict(res.headers) headers["Set-Cookie"] = f'{NAME}={group}; path=/' - headers = Headers.new(headers.items()) - return Response.new(res.body, headers=headers) + return Response(res.body, headers=headers) return fetch(urlunparse(url)) ``` diff --git a/src/content/docs/workers/examples/accessing-the-cloudflare-object.mdx b/src/content/docs/workers/examples/accessing-the-cloudflare-object.mdx index bef6a8b89eeb4c4..47039f0e893ec93 100644 --- a/src/content/docs/workers/examples/accessing-the-cloudflare-object.mdx +++ b/src/content/docs/workers/examples/accessing-the-cloudflare-object.mdx @@ -60,13 +60,14 @@ export default { ```py import json -from js import Response, Headers, JSON +from workers import Response +from js import JSON def on_fetch(request): error = json.dumps({ "error": "The `cf` object is not available inside the preview." }) data = request.cf if request.cf is not None else error - headers = Headers.new({"content-type":"application/json"}.items()) - return Response.new(JSON.stringify(data, None, 2), headers=headers) + headers = {"content-type":"application/json"} + return Response(JSON.stringify(data, None, 2), headers=headers) ``` diff --git a/src/content/docs/workers/examples/aggregate-requests.mdx b/src/content/docs/workers/examples/aggregate-requests.mdx index 5ca1a8673b73d87..b3717a412a2fa2d 100644 --- a/src/content/docs/workers/examples/aggregate-requests.mdx +++ b/src/content/docs/workers/examples/aggregate-requests.mdx @@ -61,7 +61,9 @@ export default { ```py -from js import Response, fetch, Headers, JSON, Promise +from workers import Response, fetch +import asyncio +import json async def on_fetch(request): # some_host is set up to return JSON responses @@ -69,11 +71,11 @@ async def on_fetch(request): url1 = some_host + "/todos/1" url2 = some_host + "/todos/2" - responses = await Promise.all([fetch(url1), fetch(url2)]) - results = await Promise.all(map(lambda r: r.json(), responses)) + responses = await asyncio.gather(fetch(url1), fetch(url2)) + results = await asyncio.gather(*(r.json() for r in responses)) - headers = Headers.new({"content-type": "application/json;charset=UTF-8"}.items()) - return Response.new(JSON.stringify(results), headers=headers) + headers = {"content-type": "application/json;charset=UTF-8"} + return Response.json(results, headers=headers) ``` diff --git a/src/content/docs/workers/examples/alter-headers.mdx b/src/content/docs/workers/examples/alter-headers.mdx index c3dc7b8ad2871ee..d85457e48c9ea9c 100644 --- a/src/content/docs/workers/examples/alter-headers.mdx +++ b/src/content/docs/workers/examples/alter-headers.mdx @@ -80,28 +80,27 @@ export default { ```py -from js import Response, fetch +from workers import Response, fetch async def on_fetch(request): response = await fetch("https://example.com") - # Clone the response so that it's no longer immutable - new_response = Response.new(response.body, response) + # Grab the response headers so they can be modified + new_headers = response.headers # Add a custom header with a value - new_response.headers.append( - "x-workers-hello", - "Hello from Cloudflare Workers" - ) - + new_headers["x-workers-hello"] = "Hello from Cloudflare Workers" + # Delete headers - new_response.headers.delete("x-header-to-delete") - new_response.headers.delete("x-header2-to-delete") + if "x-header-to-delete" in new_headers: + del new_headers["x-header-to-delete"] + if "x-header2-to-delete" in new_headers: + del new_headers["x-header2-to-delete"] # Adjust the value for an existing header - new_response.headers.set("x-header-to-change", "NewValue") + new_headers["x-header-to-change"] = "NewValue" - return new_response + return Response(response.body, headers=new_headers) ``` diff --git a/src/content/docs/workers/examples/auth-with-headers.mdx b/src/content/docs/workers/examples/auth-with-headers.mdx index 5cd4e327e37d720..2c0cc9a0299df52 100644 --- a/src/content/docs/workers/examples/auth-with-headers.mdx +++ b/src/content/docs/workers/examples/auth-with-headers.mdx @@ -79,20 +79,20 @@ export default { ```py -from js import Response, fetch +from workers import Response, fetch async def on_fetch(request): PRESHARED_AUTH_HEADER_KEY = "X-Custom-PSK" PRESHARED_AUTH_HEADER_VALUE = "mypresharedkey" - psk = request.headers.get(PRESHARED_AUTH_HEADER_KEY) + psk = request.headers[PRESHARED_AUTH_HEADER_KEY] if psk == PRESHARED_AUTH_HEADER_VALUE: # Correct preshared header key supplied. Fetch request from origin. return fetch(request) # Incorrect key supplied. Reject the request. - return Response.new("Sorry, you have supplied an invalid key.", status=403); + return Response("Sorry, you have supplied an invalid key.", status=403) ``` diff --git a/src/content/docs/workers/examples/block-on-tls.mdx b/src/content/docs/workers/examples/block-on-tls.mdx index 7d63a03ae995653..05741afacb2fb6c 100644 --- a/src/content/docs/workers/examples/block-on-tls.mdx +++ b/src/content/docs/workers/examples/block-on-tls.mdx @@ -72,12 +72,12 @@ export default { ```py -from js import Response, fetch +from workers import Response, fetch async def on_fetch(request): tls_version = request.cf.tlsVersion if tls_version not in ("TLSv1.2", "TLSv1.3"): - return Response.new("Please use TLS version 1.2 or higher.", status=403) + return Response("Please use TLS version 1.2 or higher.", status=403) return fetch(request) ``` diff --git a/src/content/docs/workers/examples/bulk-redirects.mdx b/src/content/docs/workers/examples/bulk-redirects.mdx index ffc1f5553ba9a90..e29389c3597dd73 100644 --- a/src/content/docs/workers/examples/bulk-redirects.mdx +++ b/src/content/docs/workers/examples/bulk-redirects.mdx @@ -76,7 +76,8 @@ export default { ```py -from js import Response, fetch, URL +from workers import Response, fetch +from urllib.parse import urlparse async def on_fetch(request): external_hostname = "examples.cloudflareworkers.com" @@ -88,8 +89,8 @@ async def on_fetch(request): "/bulk4": "https://google.com", } - url = URL.new(request.url) - location = redirect_map.get(url.pathname, None) + url = urlparse(request.url) + location = redirect_map.get(url.path, None) if location: return Response.redirect(location, 301) diff --git a/src/content/docs/workers/examples/conditional-response.mdx b/src/content/docs/workers/examples/conditional-response.mdx index f4546e414caac80..8ad70c4a9a371a5 100644 --- a/src/content/docs/workers/examples/conditional-response.mdx +++ b/src/content/docs/workers/examples/conditional-response.mdx @@ -120,37 +120,38 @@ export default { ```py import re -from js import Response, URL, fetch +from workers import Response +from urllib.parse import urlparse async def on_fetch(request): blocked_hostnames = ["nope.mywebsite.com", "bye.website.com"] - url = URL.new(request.url) + url = urlparse(request.url) # Block on hostname if url.hostname in blocked_hostnames: - return Response.new("Blocked Host", status=403) + return Response("Blocked Host", status=403) # On paths ending in .doc or .xml - if re.search(r'\.(doc|xml)$', url.pathname): - return Response.new("Blocked Extension", status=403) + if re.search(r'\.(doc|xml)$', url.path): + return Response("Blocked Extension", status=403) # On HTTP method if "POST" in request.method: - return Response.new("Response for POST") + return Response("Response for POST") # On User Agent user_agent = request.headers["User-Agent"] or "" if "bot" in user_agent: - return Response.new("Block User Agent containing bot", status=403) + return Response("Block User Agent containing bot", status=403) # On Client's IP address client_ip = request.headers["CF-Connecting-IP"] if client_ip == "1.2.3.4": - return Response.new("Block the IP 1.2.3.4", status=403) + return Response("Block the IP 1.2.3.4", status=403) # On ASN if request.cf and request.cf.asn == 64512: - return Response.new("Block the ASN 64512 response") + return Response("Block the ASN 64512 response") # On Device Type # Requires Enterprise "CF-Device-Type Header" zone setting or diff --git a/src/content/docs/workers/examples/country-code-redirect.mdx b/src/content/docs/workers/examples/country-code-redirect.mdx index c5820473fceb57e..8f18795b5918064 100644 --- a/src/content/docs/workers/examples/country-code-redirect.mdx +++ b/src/content/docs/workers/examples/country-code-redirect.mdx @@ -82,7 +82,7 @@ export default { ```py -from js import Response, fetch +from workers import Response, fetch async def on_fetch(request): countries = { diff --git a/src/content/docs/workers/examples/extract-cookie-value.mdx b/src/content/docs/workers/examples/extract-cookie-value.mdx index 0ad1ee9cf5b7780..035fcd8bc11a46f 100644 --- a/src/content/docs/workers/examples/extract-cookie-value.mdx +++ b/src/content/docs/workers/examples/extract-cookie-value.mdx @@ -58,7 +58,7 @@ export default { ```py from http.cookies import SimpleCookie -from js import Response +from workers import Response async def on_fetch(request): # Name of the cookie @@ -68,9 +68,9 @@ async def on_fetch(request): if cookie_name in cookies: # Respond with cookie value - return Response.new(cookies[cookie_name].value) + return Response(cookies[cookie_name].value) - return Response.new("No cookie with name: " + cookie_name) + return Response("No cookie with name: " + cookie_name) ``` diff --git a/src/content/docs/workers/examples/fetch-json.mdx b/src/content/docs/workers/examples/fetch-json.mdx index b04dae8b0a44b58..eedeaf129abc3a0 100644 --- a/src/content/docs/workers/examples/fetch-json.mdx +++ b/src/content/docs/workers/examples/fetch-json.mdx @@ -74,7 +74,8 @@ export default { ```py -from js import Response, fetch, Headers, JSON +from workers import Response, fetch +import json async def on_fetch(request): url = "https://jsonplaceholder.typicode.com/todos/1" @@ -85,15 +86,15 @@ async def on_fetch(request): content_type = headers["content-type"] or "" if "application/json" in content_type: - return (content_type, JSON.stringify(await response.json())) + return (content_type, json.dumps(await response.json())) return (content_type, await response.text()) response = await fetch(url) content_type, result = await gather_response(response) - headers = Headers.new({"content-type": content_type}.items()) - return Response.new(result, headers=headers) + headers = {"content-type": content_type} + return Response(result, headers=headers) ``` diff --git a/src/content/docs/workers/examples/geolocation-app-weather.mdx b/src/content/docs/workers/examples/geolocation-app-weather.mdx index 608ec84ca958f27..a3a65f984eb761e 100644 --- a/src/content/docs/workers/examples/geolocation-app-weather.mdx +++ b/src/content/docs/workers/examples/geolocation-app-weather.mdx @@ -123,7 +123,7 @@ export default { ```py -from js import Response, Headers, fetch +from workers import Response, fetch async def on_fetch(request): endpoint = "https://api.waqi.info/feed/geo:" @@ -140,11 +140,11 @@ async def on_fetch(request): html_content += "

This is a demo using Workers geolocation data.

" html_content += f"You are located at: {latitude},{longitude}.

" - html_content += f"

Based off sensor data from {content.data.city.name}:

" - html_content += f"

The AQI level is: {content.data.aqi}.

" - html_content += f"

The N02 level is: {content.data.iaqi.no2.v}.

" - html_content += f"

The O3 level is: {content.data.iaqi.o3.v}.

" - html_content += f"

The temperature is: {content.data.iaqi.t.v}°C.

" + html_content += f"

Based off sensor data from {content['data']['city']['name']}:

" + html_content += f"

The AQI level is: {content['data']['aqi']}.

" + html_content += f"

The N02 level is: {content['data']['iaqi']['no2']['v']}.

" + html_content += f"

The O3 level is: {content['data']['iaqi']['o3']['v']}.

" + html_content += f"

The temperature is: {content['data']['iaqi']['t']['v']}°C.

" html = f""" @@ -159,8 +159,8 @@ async def on_fetch(request): """ - headers = Headers.new({"content-type": "text/html;charset=UTF-8"}.items()) - return Response.new(html, headers=headers) + headers = {"content-type": "text/html;charset=UTF-8"} + return Response(html, headers=headers) ```
diff --git a/src/content/docs/workers/examples/geolocation-hello-world.mdx b/src/content/docs/workers/examples/geolocation-hello-world.mdx index 9ac167fa28a8608..1c8f7f52e200b97 100644 --- a/src/content/docs/workers/examples/geolocation-hello-world.mdx +++ b/src/content/docs/workers/examples/geolocation-hello-world.mdx @@ -103,7 +103,7 @@ export default { ```py -from js import Response, Headers +from workers import Response async def on_fetch(request): html_content = "" @@ -133,8 +133,8 @@ async def on_fetch(request): """ - headers = Headers.new({"content-type": "text/html;charset=UTF-8"}.items()) - return Response.new(html, headers=headers) + headers = {"content-type": "text/html;charset=UTF-8"} + return Response(html, headers=headers) ``` diff --git a/src/content/docs/workers/examples/hot-link-protection.mdx b/src/content/docs/workers/examples/hot-link-protection.mdx index 5da32227d51ac67..0555823f2f251cb 100644 --- a/src/content/docs/workers/examples/hot-link-protection.mdx +++ b/src/content/docs/workers/examples/hot-link-protection.mdx @@ -82,7 +82,8 @@ export default { ```py -from js import Response, URL, fetch +from workers import Response, fetch +from urllib.parse import urlparse async def on_fetch(request): homepage_url = "https://tutorial.cloudflareworkers.com/" @@ -97,7 +98,7 @@ async def on_fetch(request): if referer and content_type.startswith(protected_type): # If the hostnames don't match, it's a hotlink - if URL.new(referer).hostname != URL.new(request.url).hostname: + if urlparse(referer).hostname != urlparse(request.url).hostname: # Redirect the user to your website return Response.redirect(homepage_url, 302) diff --git a/src/content/docs/workers/examples/logging-headers.mdx b/src/content/docs/workers/examples/logging-headers.mdx index 9a88fd2e1f23247..cd388f0336e16db 100644 --- a/src/content/docs/workers/examples/logging-headers.mdx +++ b/src/content/docs/workers/examples/logging-headers.mdx @@ -45,11 +45,11 @@ export default { ```py -from js import Response +from workers import Response async def on_fetch(request): print(dict(request.headers)) - return Response.new('Hello world') + return Response('Hello world') ``` diff --git a/src/content/docs/workers/examples/modify-response.mdx b/src/content/docs/workers/examples/modify-response.mdx index 4a39af9957c7c78..cbc4f80b8d7daaa 100644 --- a/src/content/docs/workers/examples/modify-response.mdx +++ b/src/content/docs/workers/examples/modify-response.mdx @@ -122,7 +122,8 @@ export default { ```py -from js import Response, fetch, JSON +from workers import Response, fetch +import json async def on_fetch(request): header_name_src = "foo" # Header to get the new value from @@ -132,12 +133,12 @@ async def on_fetch(request): original_response = await fetch(request) # Change status and statusText, but preserve body and headers - response = Response.new(original_response.body, status=500, statusText="some message", headers=original_response.headers) + response = Response(original_response.body, status=500, status_text="some message", headers=original_response.headers) # Change response body by adding the foo prop - original_body = await original_response.json() - original_body.foo = "bar" - response = Response.new(JSON.stringify(original_body), response) + new_body = await original_response.json() + new_body["foo"] = "bar" + response.replace_body(json.dumps(new_body)) # Add a new header response.headers["foo"] = "bar" diff --git a/src/content/docs/workers/examples/protect-against-timing-attacks.mdx b/src/content/docs/workers/examples/protect-against-timing-attacks.mdx index 3b6fe6dedfa7066..81650f8510e5673 100644 --- a/src/content/docs/workers/examples/protect-against-timing-attacks.mdx +++ b/src/content/docs/workers/examples/protect-against-timing-attacks.mdx @@ -68,29 +68,30 @@ export default { ```py -from js import Response, TextEncoder, crypto +from workers import Response +from js import TextEncoder, crypto async def on_fetch(request, env): auth_token = request.headers["Authorization"] or "" secret = env.MY_SECRET_VALUE if secret is None: - return Response.new("Missing secret binding", status=500) + return Response("Missing secret binding", status=500) if len(auth_token) != len(secret): - return Response.new("Unauthorized", status=401) + return Response("Unauthorized", status=401) if a.byteLength != b.byteLength: - return Response.new("Unauthorized", status=401) + return Response("Unauthorized", status=401) encoder = TextEncoder.new() a = encoder.encode(auth_token) b = encoder.encode(secret) if not crypto.subtle.timingSafeEqual(a, b): - return Response.new("Unauthorized", status=401) + return Response("Unauthorized", status=401) - return Response.new("Welcome!") + return Response("Welcome!") ``` diff --git a/src/content/docs/workers/examples/redirect.mdx b/src/content/docs/workers/examples/redirect.mdx index 1023ba94f427bcf..0baffd289f2aaa7 100644 --- a/src/content/docs/workers/examples/redirect.mdx +++ b/src/content/docs/workers/examples/redirect.mdx @@ -43,7 +43,7 @@ export default { ```py -from js import Response +from workers import Response def on_fetch(request): destinationURL = "https://example.com" @@ -110,15 +110,16 @@ export default { ```py -from js import Response, URL +from workers import Response +from urllib.parse import urlparse async def on_fetch(request): base = "https://example.com" statusCode = 301 - url = URL.new(request.url) + url = urlparse(request.url) - destinationURL = f'{base}{url.pathname}{url.search}' + destinationURL = f'{base}{url.path}{url.query}' print(destinationURL) return Response.redirect(destinationURL, statusCode) diff --git a/src/content/docs/workers/examples/respond-with-another-site.mdx b/src/content/docs/workers/examples/respond-with-another-site.mdx index 501eba7fe74cce6..a6b0387439a11cf 100644 --- a/src/content/docs/workers/examples/respond-with-another-site.mdx +++ b/src/content/docs/workers/examples/respond-with-another-site.mdx @@ -48,13 +48,13 @@ export default { ```py -from js import Response, fetch, Headers +from workers import Response, fetch def on_fetch(request): def method_not_allowed(request): msg = f'Method {request.method} not allowed.' - headers = Headers.new({"Allow": "GET"}.items) - return Response.new(msg, headers=headers, status=405) + headers = {"Allow": "GET"} + return Response(msg, headers=headers, status=405) # Only GET requests work with this proxy. if request.method != "GET": diff --git a/src/content/docs/workers/examples/return-html.mdx b/src/content/docs/workers/examples/return-html.mdx index a4549ce74cd0d53..9a610662a23782e 100644 --- a/src/content/docs/workers/examples/return-html.mdx +++ b/src/content/docs/workers/examples/return-html.mdx @@ -47,7 +47,7 @@ export default { ```py -from js import Response, Headers +from workers import Response def on_fetch(request): html = """ @@ -56,8 +56,8 @@ def on_fetch(request):

This markup was generated by a Cloudflare Worker.

""" - headers = Headers.new({"content-type": "text/html;charset=UTF-8"}.items()) - return Response.new(html, headers=headers) + headers = {"content-type": "text/html;charset=UTF-8"} + return Response(html, headers=headers) ```
diff --git a/src/content/docs/workers/examples/return-json.mdx b/src/content/docs/workers/examples/return-json.mdx index 7d8fc7b99b81f8f..9cf9dfa612db7f6 100644 --- a/src/content/docs/workers/examples/return-json.mdx +++ b/src/content/docs/workers/examples/return-json.mdx @@ -44,13 +44,13 @@ export default { ```py -from js import Response, Headers +from workers import Response import json def on_fetch(request): data = json.dumps({"hello": "world"}) - headers = Headers.new({"content-type": "application/json"}.items()) - return Response.new(data, headers=headers) + headers = {"content-type": "application/json"} + return Response(data, headers=headers) ``` diff --git a/src/content/docs/workers/examples/security-headers.mdx b/src/content/docs/workers/examples/security-headers.mdx index 0cb2322dda5d926..c1084abc56511b5 100644 --- a/src/content/docs/workers/examples/security-headers.mdx +++ b/src/content/docs/workers/examples/security-headers.mdx @@ -201,7 +201,7 @@ export default { ```py -from js import Response, fetch, Headers +from workers import Response, fetch async def on_fetch(request): default_security_headers = { @@ -232,23 +232,23 @@ async def on_fetch(request): blocked_headers = ["Public-Key-Pins", "X-Powered-By" ,"X-AspNet-Version"] res = await fetch(request) - new_headers = Headers.new(res.headers) + new_headers = res.headers # This sets the headers for HTML responses if "text/html" in new_headers["Content-Type"]: - return Response.new(res.body, status=res.status, statusText=res.statusText, headers=new_headers) + return Response(res.body, status=res.status, statusText=res.statusText, headers=new_headers) for name in default_security_headers: - new_headers.set(name, default_security_headers[name]) + new_headers[name] = default_security_headers[name] for name in blocked_headers: - new_headers.delete(name) + del new_headers["name"] tls = request.cf.tlsVersion if not tls in ("TLSv1.2", "TLSv1.3"): - return Response.new("You need to use TLS version 1.2 or higher.", status=400) - return Response.new(res.body, status=res.status, statusText=res.statusText, headers=new_headers) + return Response("You need to use TLS version 1.2 or higher.", status=400) + return Response(res.body, status=res.status, statusText=res.statusText, headers=new_headers) ``` diff --git a/src/content/docs/workers/languages/python/examples.mdx b/src/content/docs/workers/languages/python/examples.mdx index 4e0d4957746241f..a083955863c2683 100644 --- a/src/content/docs/workers/languages/python/examples.mdx +++ b/src/content/docs/workers/languages/python/examples.mdx @@ -14,7 +14,7 @@ In addition to those examples, consider the following ones that illustrate Pytho ## Parse an incoming request URL ```python -from js import Response +from workers import Response from urllib.parse import urlparse, parse_qs async def on_fetch(request, env): @@ -25,30 +25,31 @@ async def on_fetch(request, env): if "name" in params: greeting = "Hello there, {name}".format(name=params["name"][0]) - return Response.new(greeting) + return Response(greeting) if url.path == "/favicon.ico": - return Response.new("") + return Response("") - return Response.new("Hello world!") + return Response("Hello world!") ``` ## Parse JSON from the incoming request ```python -from js import Response +from workers import Response async def on_fetch(request): name = (await request.json()).name - return Response.new("Hello, {name}".format(name=name)) + return Response("Hello, {name}".format(name=name)) ``` ## Emit logs from your Python Worker ```python # To use the JavaScript console APIs -from js import console, Response +from js import console +from workers import Response # To use the native Python logging import logging @@ -69,15 +70,17 @@ async def on_fetch(request): # Or just use print() print("print() from Python!") - return Response.new("We're testing logging!") + return Response("We're testing logging!") ``` ## Publish to a Queue ```python -from js import Response, Object +from js import Object from pyodide.ffi import to_js as _to_js +from workers import Response + # to_js converts between Python dictionaries and JavaScript Objects def to_js(obj): return _to_js(obj, dict_converter=Object.fromEntries) @@ -93,13 +96,13 @@ async def on_fetch(request, env): await env.QUEUE.send(to_js({"hello": "world"})) # Return a response - return Response.json(to_js({"write": "success"})) + return Response.json({"write": "success"}) ``` ## Query a D1 Database ```python -from js import Response +from workers import Response async def on_fetch(request, env): results = await env.DB.prepare("PRAGMA table_list").all() diff --git a/src/content/docs/workers/languages/python/ffi.mdx b/src/content/docs/workers/languages/python/ffi.mdx index 5fd704b8d9a7f59..f8ff1e67299a2d7 100644 --- a/src/content/docs/workers/languages/python/ffi.mdx +++ b/src/content/docs/workers/languages/python/ffi.mdx @@ -38,12 +38,12 @@ kv_namespaces = [ ...and then call `.get()` on the binding object that is exposed on `env`: ```python -from js import Response +from workers 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" + return Response(bar) # returns "baz" ``` Under the hood, `env` is actually a JavaScript object. When you call `.FOO`, you are accessing this property via a [`JsProxy`](https://pyodide.org/en/stable/usage/api/python-api/ffi.html#pyodide.ffi.JsProxy) — special proxy object that makes a JavaScript object behave like a Python object. diff --git a/src/content/docs/workers/languages/python/how-python-workers-work.mdx b/src/content/docs/workers/languages/python/how-python-workers-work.mdx index 2c188943083b4e8..5189e314e7395f5 100644 --- a/src/content/docs/workers/languages/python/how-python-workers-work.mdx +++ b/src/content/docs/workers/languages/python/how-python-workers-work.mdx @@ -18,10 +18,10 @@ When you write a Python Worker, your code is interpreted directly by Pyodide, wi ## Local Development Lifecycle ```python -from js import Response +from workers import Response async def on_fetch(request, env): - return Response.new("Hello world!") + return Response("Hello world!") ``` …with a [Wrangler configuration file](/workers/wrangler/configuration/) that points to a .py file: diff --git a/src/content/docs/workers/languages/python/index.mdx b/src/content/docs/workers/languages/python/index.mdx index 4646ec93654be4a..d26ffa44db61258 100644 --- a/src/content/docs/workers/languages/python/index.mdx +++ b/src/content/docs/workers/languages/python/index.mdx @@ -41,10 +41,10 @@ npx wrangler@latest dev A Python Worker can be as simple as three lines of code: ```python -from js import Response +from workers import Response def on_fetch(request): - return Response.new("Hello World!") + return Response("Hello World!") ``` Similar to Workers written in [JavaScript](/workers/languages/javascript), [TypeScript](/workers/languages/typescript), or [Rust](/workers/languages/rust/), the main entry point for a Python worker is the [`fetch` handler](/workers/runtime-apis/handlers/fetch). In a Python Worker, this handler is named `on_fetch`. @@ -74,10 +74,10 @@ Now, we can modify `src/entry.py` to make use of the new module. ```python from hello import hello -from js import Response +from workers import Response def on_fetch(request): - return Response.new(hello("World")) + return Response(hello("World")) ``` Once you edit `src/entry.py`, Wrangler will automatically detect the change and @@ -93,12 +93,12 @@ Let's try editing the worker to accept a POST request. We know from the JSON. In a Python Worker, you would write: ```python -from js import Response +from workers import Response from hello import hello async def on_fetch(request): name = (await request.json()).name - return Response.new(hello(name)) + return Response(hello(name)) ``` Once you edit the `src/entry.py`, Wrangler should automatically restart the local @@ -142,10 +142,10 @@ API_HOST = "example.com" Then, you can access the `API_HOST` environment variable via the `env` parameter: ```python -from js import Response +from workers import Response async def on_fetch(request, env): - return Response.new(env.API_HOST) + return Response(env.API_HOST) ``` ## Further Reading diff --git a/src/content/docs/workers/languages/python/packages/langchain.mdx b/src/content/docs/workers/languages/python/packages/langchain.mdx index 72820aad4aeaa9c..f67b14de02d15ad 100644 --- a/src/content/docs/workers/languages/python/packages/langchain.mdx +++ b/src/content/docs/workers/languages/python/packages/langchain.mdx @@ -32,7 +32,7 @@ npx wrangler@latest dev ### Example code ```python -from js import Response +from workers import Response from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI @@ -42,5 +42,5 @@ async def on_fetch(request, env): chain = prompt | llm res = await chain.ainvoke({"profession": "electrician"}) - return Response.new(res.split(".")[0].strip()) + return Response(res.split(".")[0].strip()) ```