Django Channels does not yet include a Multiplexing Consumer. This project aims to add such a multiplexer.
Channels Version | Channels Multiplexer Version |
---|---|
v2 | 0.0.2 |
v3 | >=0.0.3 |
pip install channelsmultiplexer
to create a De-Multiplexer
class EchoDemultiplexerAsyncJson(AsyncJsonWebsocketDemultiplexer):
applications = {
"echostream": EchoTestConsumer.as_asgi(),
"altechostream": AltEchoTestConsumer.as_asgi(),
"closeafterfirst": EchoCloseAfterFirstTestConsumer.as_asgi(),
"neveraccept": NeverAcceptTestConsumer.as_asgi()
}
When using this within our application you should reference it like this EchoDemultiplexerAsyncJson.as_asgi().
or you can use the AsyncJsonWebsocketDemultiplexer type directly and pass the multiplexed upstream consumers as kwargs.
application = ProtocolTypeRouter({
"websocket": URLRouter([
url(r"^ws/$", AsyncJsonWebsocketDemultiplexer.as_asgi(
echostream = EchoTestConsumer.as_asgi(),
altechostream = AltEchoTestConsumer.as_asgi(),
closeafterfirst = EchoCloseAfterFirstTestConsumer.as_asgi(),
neveraccept = NeverAcceptTestConsumer.as_asgi()
)),
]),
"telegram": ChattyBotConsumer.as_asgi(),
})
This acts just as any other channels consumer, however it will route incoming (JSON) messages to the upstream Consumers.
It does this by reading the value of the stream attribute in the message body. It will then pass the value of the payload attribute upstream.
{
"stream": "echostream",
"payload": {"hello": "world"}
}
Messages being sent downstream from the Multiplexed consumers will be embedded within a similar style msg.