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 的帮助下(。这会有所作为吗?

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

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

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

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

后端实现选择无关紧要。

最新更新