从Django Channels组中删除特定用户?

时间:2019-02-04 14:52:28

标签: django django-channels

我有几个Django渠道组,可用于向客户发送各种消息。

我可以仅使用要删除的用户的ID从这些组之一中删除特定用户吗?

另一种可能的选择是仅使用用户ID强制断开用户的连接。

4 个答案:

答案 0 :(得分:0)

您需要像这样在使用者scope['user']方法中阻止基于connect的连接:

class MyConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        id_cannot_connect = 1
        if self.scope['user'] == id_cannot_connect:
            await self.close()
        else:
            await self.accept()

如果要列出允许连接到特定组的用户列表,则需要在数据库中存储组和组用户,并以与上述类似的connect方法使用它。

编辑:您可以从receive_json中的group_discard丢弃用户的频道,而您仍然可以访问self.scope['user']来过滤所需的用户。

答案 1 :(得分:0)

最后,我通过在通道连接上存储每个通道名称(self.channel_name)并在断开连接时将其删除来解决了这个问题。然后将它们绑定到Django用户对象。

现在,如果要从组中删除用户,我可以循环访问与用户对象绑定的所有存储通道名称,然后运行group_discard。

答案 2 :(得分:0)

我已经考虑了几天这个问题,并且知道如何实现,但是目前无法测试。您应该尝试像这样更改receive() method

async def receive(self, text_data=None, bytes_data=None):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        users_to_kick = text_data_json['kick']

        # you should inspect scope['user'] cuz I am not sure in what place
        # user's id is placed, but there is 'user' object.
        if self.scope['user']['id'] in list(map(int, users_to_kick)):
            await self.close()
        else:
            await self.channel_layer.group_send(
                self.room_group_name,
                {
                    'type': 'some_method',
                    'message': message
                 }
             )

您必须启用 Authorization 系统,您不能踢匿名用户。而且您必须从前端发送要踢的用户列表。

答案 3 :(得分:0)

首先,您必须将用户的频道名称保存到他们的模型中

我们假设您也有频道的组名

然后您可以使用 group_discard 从组中删除用户,如下所示:

group_name = 'name_of_channels_group'
user = User.objects.get(id=id)
channel_name = user.channel_name
async_to_sync(self.channel_layer.group_discard)(group_name, channel_name)

https://channels.readthedocs.io/en/stable/topics/channel_layers.html?highlight=group_send#groups