Django渠道在哪里存储用户的渠道名称?

时间:2019-08-14 10:25:18

标签: python django websocket python-asyncio django-channels

我正在尝试将用户添加到Django频道组中,但是我不知道该用户的频道名称。只有他们的数据库ID /用户名。我一直在阅读频道的文档,但无法发现这些频道名称的存储位置。

通常,我可以从渠道的传播者内部,通过以下方式将传播者的用户添加到组中:

class OrderConsumer(AsyncJsonWebsocketConsumer):
    def __init__(self, scope): ...

    async def connect(self): ...

    async def add_user_to_group(self, group_name):
        await self.channel_layer.group_add(
            group=group_name,
            channel=self.channel_name
        )

是否可以通过数据库访问另一个用户的“ self.channel_name”?还是其他?如果可以,怎么办?


我正在使用InMemoryChannelLayer进行测试:

TEST_CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels.layers.InMemoryChannelLayer',
    },
}

但是我的实时部署中有一个redis数据库(借助于channels-redis)。 这会有所作为吗?

2 个答案:

答案 0 :(得分:0)

if( $(".carousel-item").first().hasClass("active") ){ // do something } 是在您的channel_name中定义的,并且routing.py应该是您的消费者类中的一个属性:

group_name

因此,当用户访问连接到您的websocket的网址时,您可以通过class MyConsumer(WebsocketConsumer): # @property def group_name(self): name = ... return name 方法拒绝或接受它们。

后端实现选择无关。

答案 1 :(得分:0)

您已经发现,通道名称是由通道服务器分配的,因此无法为给定用户计算通道名称。大多数人要跟踪单个用户的频道,就是将每个用户添加到一个唯一组,该组的名称是根据用户的DB ID或任何其他唯一字段生成的。这样,如果您想向特定用户发送消息,则可以轻松地根据用户数据计算其组名