-
Notifications
You must be signed in to change notification settings - Fork 293
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Python: Pass the env parameter into handlers (#1610)
This adds a relaxed_call function taken from pyodide/pyodide#4392 and uses it to pass the env argument to the fetch/test handlers
- Loading branch information
Showing
4 changed files
with
159 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
using Workerd = import "/workerd/workerd.capnp"; | ||
|
||
const config :Workerd.Config = ( | ||
services = [ | ||
(name = "main", worker = .mainWorker), | ||
], | ||
|
||
sockets = [ | ||
# Serve HTTP on port 8080. | ||
( name = "http", | ||
address = "*:8080", | ||
http = (), | ||
service = "main" | ||
), | ||
], | ||
autogates = [ | ||
# Pyodide is included as a builtin wasm module so it requires the | ||
# corresponding autogate flag. | ||
"workerd-autogate-builtin-wasm-modules", | ||
] | ||
); | ||
|
||
const mainWorker :Workerd.Worker = ( | ||
modules = [ | ||
(name = "worker.py", pythonModule = embed "./worker.py"), | ||
], | ||
compatibilityDate = "2023-12-18", | ||
compatibilityFlags = ["experimental"], | ||
bindings = [ | ||
( | ||
name = "secret", | ||
text = "thisisasecret" | ||
), | ||
], | ||
# Learn more about compatibility dates at: | ||
# https://developers.cloudflare.com/workers/platform/compatibility-dates/ | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
from js import Response | ||
|
||
|
||
def fetch(request, env): | ||
print(env.secret) | ||
return Response.new("hello world") | ||
|
||
|
||
def test(ctx, env): | ||
print(env.secret) | ||
print("Hi there, this is a test") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
""" | ||
Allow calling functions with more arguments than they want | ||
Copied from | ||
https://github.com/pyodide/pyodide/pull/4392/ | ||
""" | ||
|
||
from collections.abc import Callable | ||
from functools import lru_cache, wraps | ||
from inspect import Parameter, Signature, signature | ||
from typing import Any, ParamSpec, TypeVar | ||
|
||
|
||
def _relaxed_call_sig(func: Callable[..., Any]) -> Signature | None: | ||
try: | ||
sig = signature(func) | ||
except (TypeError, ValueError): | ||
return None | ||
new_params = list(sig.parameters.values()) | ||
idx: int | None = -1 | ||
for idx, param in enumerate(new_params): | ||
if param.kind in (Parameter.KEYWORD_ONLY, Parameter.VAR_KEYWORD): | ||
break | ||
if param.kind == Parameter.VAR_POSITIONAL: | ||
idx = None | ||
break | ||
else: | ||
idx += 1 | ||
if idx is not None: | ||
new_params.insert(idx, Parameter("__var_positional", Parameter.VAR_POSITIONAL)) | ||
|
||
for param in new_params: | ||
if param.kind == Parameter.VAR_KEYWORD: | ||
break | ||
else: | ||
new_params.append(Parameter("__var_keyword", Parameter.VAR_KEYWORD)) | ||
new_sig = sig.replace(parameters=new_params) | ||
return new_sig | ||
|
||
|
||
@lru_cache | ||
def _relaxed_call_sig_cached(func: Callable[..., Any]) -> Signature | None: | ||
return _relaxed_call_sig(func) | ||
|
||
|
||
def _do_call( | ||
func: Callable[..., Any], sig: Signature, args: Any, kwargs: dict[str, Any] | ||
) -> Any: | ||
bound = sig.bind(*args, **kwargs) | ||
bound.arguments.pop("__var_positional", None) | ||
bound.arguments.pop("__var_keyword", None) | ||
return func(*bound.args, **bound.kwargs) | ||
|
||
|
||
Param = ParamSpec("Param") | ||
Param2 = ParamSpec("Param2") | ||
RetType = TypeVar("RetType") | ||
|
||
|
||
def relaxed_wrap(func: Callable[Param, RetType]) -> Callable[..., RetType]: | ||
"""Decorator which creates a function that ignores extra arguments | ||
If extra positional or keyword arguments are provided they will be | ||
discarded. | ||
""" | ||
sig = _relaxed_call_sig(func) | ||
if sig is None: | ||
raise TypeError("Cannot wrap function") | ||
else: | ||
sig2 = sig | ||
|
||
@wraps(func) | ||
def wrapper(*args: Param.args, **kwargs: Param.kwargs) -> RetType: | ||
return _do_call(func, sig2, args, kwargs) | ||
|
||
return wrapper | ||
|
||
|
||
def relaxed_call(func: Callable[..., RetType], *args: Any, **kwargs: Any) -> RetType: | ||
"""Call the function ignoring extra arguments | ||
If extra positional or keyword arguments are provided they will be | ||
discarded. | ||
""" | ||
sig = _relaxed_call_sig_cached(func) | ||
if sig is None: | ||
return func(*args, **kwargs) | ||
return _do_call(func, sig, args, kwargs) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters