-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Endpoint class decorators #734
Copy link
Copy link
Open
Labels
Description
I need to implement a decorator for an endpoint, and for some technical reasons, I would like to implement it with a class. I also would like my decorator to not need parenthesis when called. (i.e. prefer @my_decorator over @my_decorator()).
Here is a simple implementation:
from starlette.responses import JSONResponse
from starlette.applications import Starlette
from starlette.routing import Route
class foobar:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
@foobar
def my_endpoint(request):
return JSONResponse({"response": "my_endpoint"})
app = Starlette(
debug=True,
routes=[
Route('/my_endpoint', my_endpoint),
],
)But accessing to /my_endpoint produces this traceback:
Traceback (most recent call last):
File "~/myproject/env/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "~/myproject/env/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "~/myproject/env/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
await self.middleware_stack(scope, receive, send)
File "~/myproject/env/lib/python3.8/site-packages/starlette/middleware/errors.py", line 178, in __call__
raise exc from None
File "~/myproject/env/lib/python3.8/site-packages/starlette/middleware/errors.py", line 156, in __call__
await self.app(scope, receive, _send)
File "~/myproject/env/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
raise exc from None
File "~/myproject/env/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "~/myproject/env/lib/python3.8/site-packages/starlette/routing.py", line 551, in __call__
await route.handle(scope, receive, send)
File "~/myproject/env/lib/python3.8/site-packages/starlette/routing.py", line 228, in handle
await self.app(scope, receive, send)
File "./app.py", line 11, in __call__
return self.func(*args, **kwargs)
TypeError: my_endpoint() takes 1 positional argument but 3 were givenI am not really sure what is going wrong here. I also did not find documentation about endpoint decorators with starlette.
Do I make mistakes when defining my decorator or is it something not supported by starlette?
PS: I used starlette 0.13 and python 3.8
Important
- We're using Polar.sh so you can upvote and help fund this issue.
- We receive the funding once the issue is completed & confirmed by you.
- Thank you in advance for helping prioritize & fund our backlog.
Reactions are currently unavailable