Question: Using handler decorators on methods #3173
-
Reported by @skewty in Discord: <#1212105750608871445>: The following MCVE ish code works, but for reasons outlined in this (and surrounding messages) OP prefers to use a web socket handler that is a method. Changing from litestar import Litestar, WebSocket, websocket
class Something:
@websocket("/ws")
async def handler(socket: WebSocket) -> None:
await socket.accept()
app = Litestar([Something().handler]) As per docs
Shouldn't an error be raised? Is this usage recommend? |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments
-
So I tried to implement this as a stand-alone function and discovered that any dependency named "self" breaks the route. |
Beta Was this translation helpful? Give feedback.
-
Also note the handler copies some code from: https://docs.litestar.dev/2/usage/channels.html#managing-history But when running it:
It appears the sample code in the documentation is no longer valid. async with channels.subscribe(["some_channel"]) as subscriber:
# should be changed to
async with channels.start_subscription(["some_channel"]) as subscriber: |
Beta Was this translation helpful? Give feedback.
-
The issue here is that at the time the You can fix this by changing how you pass the handlers: from litestar import Litestar, WebSocket, websocket
class Something:
async def handler(socket: WebSocket) -> None:
await socket.accept()
app = Litestar([websocket("/ws")(Something().handler)]) Litestar itself does something similar in the litestar/litestar/channels/plugin.py Lines 117 to 126 in 1332983
No, I wouldn't recommend it, and I would advise you to change how you've set up your code that this is a requirement. Usually there are ways to work around this. |
Beta Was this translation helpful? Give feedback.
-
You can also make the class a from litestar import Litestar, WebSocket, websocket, Controller
class Something(Controller):
@websocket("/ws")
async def handler(self, socket: WebSocket) -> None:
await socket.accept()
app = Litestar([Something]) |
Beta Was this translation helpful? Give feedback.
The issue here is that at the time the
@websocket
decorator is passedSomething.handler
, the function is still unbound (i.e. theself
argument won't receive the instance you created automatically, because it doesn't exist yet).You can fix this by changing how you pass the handlers:
Litestar itself does something similar in the
ChannelsPlugin
:litestar/litestar/channels/plugin.py
Lines 117 to 126 in 1332983