【问题标题】:Django Channels - Not Able to Send Messages on DisconnectDjango Channels - 无法在断开连接时发送消息
【发布时间】:2021-04-07 14:23:37
【问题描述】:

我希望能够在用户断开连接时向房间组发送消息,以便更新玩家列表。似乎一旦断开连接就不可能了,这在某种程度上是有道理的,但是我如何能够在通道断开用户连接之前向它发送消息。

我有以下代码:

async def disconnect(self, close_code):
    #Remove the disconnected player
    player = players.get_player(self.scope['session']['id'])
    players.remove_player(player.id)
    room = rooms.get_room(player.room)
    if room:
        #Sending messages on disconnect doesn't seem to work
        players_left = room.leave_room(player)
        if players_left < 1:
            rooms.remove_room(room.name)
            await self.channel_layer.group_send(
                'all_users',
                {
                    'type': 'room_list',
                }
            )
            await self.channel_layer.group_discard(
                room.name,
                self.channel_name
            )
        else:
            await self.send_room(room,'list_players')
            
async def send_room(self,room,type):
    await self.channel_layer.group_send(
        room.name,
        {
            'type': type,
            'data': room.name
        }
    )

async def list_players(self,event):
    # Send message to WebSocket
    room = rooms.get_room(event['data'])
    players = room.get_players()
    await self.send(text_data=json.dumps({
        'action': 'room_list_players',
        'payload' : {
            'players' : players,
            'owner' : room.owner.id
        }
    }))

【问题讨论】:

    标签: django django-channels


    【解决方案1】:

    这是一个老问题,我不知道是否还有人需要回答,但我发现的解决方案实际上在 Django Channels 3.0.1 中非常简单。每个WebsocketConsumer 都定义了一个websocket_disconnect 函数,该函数在调用实际的disconnect 函数之前删除当前分配给websocket 的组。显然,这意味着当您到达 disconnect 时,您将无法再发送群组消息,因为没有群组。

    解决方案是简单地覆盖 websocket_disconnect 并将您的消息发送到那里,如下所示:

    async def websocket_disconnect(self, message):
      await self.channel_layer.group_send(
        self.room_group_name,
        { 'type': 'dc_message' }
      )
      await super().websocket_disconnect(message)
    

    【讨论】:

    • 谢谢,我想我当时解决了,但不记得了。答案看起来不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2017-06-09
    相关资源
    最近更新 更多