【问题标题】:Where does Django-Channels store user's channel names?Django-Channels 在哪里存储用户的频道名称?
【发布时间】:2019-12-20 21:39:28
【问题描述】:

我正在尝试将用户添加到 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 的帮助下)。 这会有所作为吗?

【问题讨论】:

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


    【解决方案1】:

    正如您已经发现的那样,频道名称是由频道服务器分配的,无法为给定用户计算它。大多数人跟踪单个用户频道的做法是将每个用户添加到一个唯一组,该组的名称是从用户的数据库 ID 或任何其他唯一字段生成的。这样,如果你想给特定用户发送消息,你可以很容易地从用户的数据中计算出他的组名

    【讨论】:

      【解决方案2】:

      channel_name 在您的routing.py 中定义,group_name 应该是您的消费者类中的一个属性:

      class MyConsumer(WebsocketConsumer):
      
          #
      
          @property
          def group_name(self):
              name = ...
              return name
      

      因此,当用户访问连接到您的 websocket 的 url 时,您可以在 connect 方法中拒绝或接受它们。

      后端实现选择无关紧要。

      【讨论】:

      • 我还是不明白。每个连接到 websocket 的用户都有自己唯一的 channel_name。你是在告诉我我可以根据我的 routing.py 实现看到这些存储在哪里? Channel_name 没有在我的 routing.py 实现中的任何地方定义(由我明确定义或在我使用的任何类中)。
      • 那么我可能误解了你:你想在连接时通过消费者以其他方式将用户添加到组中吗?
      • 嗨。是的!我想添加一个单独的用户 [user 2] (我的意思是一个用户与被称为 [user 1] 的用户不同的用户),当用户 1 调用消费者中的函数时,我知道其 id 到一个组(数据中附加了用户 2 的 ID)我提出了一个更详细的问题here。感谢您花费的时间和精力。
      • 好吧,我可以说 KISS 甚至 YAGNI 吗? :P 您的订单已创建,您知道如何将买家添加到订单组(通常的方式)。使用 Django 消息系统或其他任何您想通知店主新订单的东西,只需创建一个简单的订单链接。店主访问该网址后,他将被添加到群组中,当他们离开页面时,他们也会自动离开群组。这也适用于买家 - 这就是你应该如何处理 websockets 的方式,对于其他一切都有好的 ol' Django。
      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2010-10-11
      • 2013-02-19
      相关资源
      最近更新 更多