我有几个Django渠道组,可用于向客户发送各种消息。
我可以仅使用要删除的用户的ID从这些组之一中删除特定用户吗?
另一种可能的选择是仅使用用户ID强制断开用户的连接。
答案 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