diff --git a/examples/in_memory/main.py b/examples/in_memory/main.py index 68b6e17..d9da58f 100644 --- a/examples/in_memory/main.py +++ b/examples/in_memory/main.py @@ -42,6 +42,13 @@ async def get_date(): async def get_datetime(request: Request, response: Response): return {"now": pendulum.now()} +@cache(namespace="test") +async def func_kwargs(*unused_args, **kwargs): + return kwargs + +@app.get("/kwargs") +async def get_kwargs(name: str): + return await func_kwargs(name, name=name) @app.get("/sync-me") @cache(namespace="test") diff --git a/fastapi_cache/decorator.py b/fastapi_cache/decorator.py index 2d8ec54..41e6b9e 100644 --- a/fastapi_cache/decorator.py +++ b/fastapi_cache/decorator.py @@ -48,7 +48,13 @@ def cache( (param for param in signature.parameters.values() if param.annotation is Response), None, ) - parameters = [*signature.parameters.values()] + parameters = [] + extra_params = [] + for p in signature.parameters.values(): + if p.kind <= inspect.Parameter.KEYWORD_ONLY: + parameters.append(p) + else: + extra_params.append(p) if not request_param: parameters.append( inspect.Parameter( @@ -65,6 +71,7 @@ def cache( kind=inspect.Parameter.KEYWORD_ONLY, ), ) + parameters.extend(extra_params) if parameters: signature = signature.replace(parameters=parameters) func.__signature__ = signature diff --git a/tests/test_decorator.py b/tests/test_decorator.py index 0eb96c1..783b9d4 100644 --- a/tests/test_decorator.py +++ b/tests/test_decorator.py @@ -67,3 +67,9 @@ def test_cache_response_obj() -> None: assert get_cache_response.json() == {"a": 1} assert get_cache_response.headers.get("cache-control") assert get_cache_response.headers.get("etag") + +def test_kwargs() -> None: + with TestClient(app) as client: + name = "Jon" + response = client.get("/kwargs", params = {"name": name}) + assert response.json() == {"name": name}