使用Django渠道将数据保存到数据库中[不是问题]

时间:2020-05-14 08:47:40

标签: django django-channels

我在通过Django通道从websocket保存数据时遇到问题。每当通道接收到玩家的数据时,它将数据添加到队列列表中,一旦队列列表被填充,它将为玩家创建一个房间并发送回玩家以告诉他们要连接哪个房间。

但是这里的问题是,该过程将停留在模型创建部分,并且不会从那里继续进行。我曾尝试使用Google搜索,但似乎找不到任何可帮助我解决此问题的东西。

代码如下: users.py

class GameLobbyConsumer(AsyncWebsocketConsumer):
    room_name = ""
    room_group_name = ""
    queue_list = []
    player_list = []

    async def connect(self):
        # Connecting to matchmaking lobby
        try:
            await self.channel_layer.group_add(
                self.room_group_name,
                self.channel_name
            )
            await self.accept()
        except Exception as e:
            print(e)

    async def disconnect(self, code):
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    async def receive(self, text_data=None, bytes_data=None):
        player_info_json = json.loads(text_data)
        player_info_dict = dict(player_info_json)
        key_verification_list = ["player_id", "name"]
        if list(player_info_dict.keys()) != key_verification_list:
            await self.close()

        response_data: dict = await self.check_queue_list(player_data=player_info_json)
        if not response_data["status"]:
            room_size = response_data["queue_size"]
            await self.channel_layer.group_send(
                self.room_group_name,
                {
                    "type": "notification",
                    "message": f"Still looking for match, {room_size}/4 players currently"
                }
            )
        else:
            players = response_data["players"]
            room_id = response_data["room_id"]
            await self.channel_layer.group_send(
                self.room_group_name,
                {
                    "type": "room_found",
                    "players": players,
                    "game_room": room_id
                }
            )

    async def notification(self, event):
        await self.send(text_data=json.dumps({
            "notification": event["message"],
            "debug": event["message"]
        }))

    async def room_found(self, event):
        player_list = event["players"]
        game_room = event["game_room"]

        await self.send(text_data=json.dumps({
            "players": player_list,
            "game_room": game_room,
            "debug": f"Game Room - {game_room} has been created"
        }))

    @database_sync_to_async
    def check_queue_list(self, player_data):
        # Check if the player has already registered for matchmaking
        if player_data not in self.queue_list and len(self.queue_list) < 4:
            self.queue_list.append(player_data)
        print("Player is added to the queue list")
        if len(self.queue_list) == 4:
            print("Full house")
            player_list = []
            for data in self.queue_list:
                player_list.append(f"{data['player_id']},{data['name']}")

            self.queue_list.clear()
            game_session, created = GameSession.objects.get_or_create(players=player_data)
            print("Game Session created")
            response = {
                "status": True,
                "room_id": game_session.room_id,
                "players": game_session.players
            }
            return response

        # Lobby does not have enough players yet
        response = {
            "status": False,
            "queue_size": len(self.queue_list)
        }
        return response

预先感谢您的任何建议。

编辑: 经过几天和几个小时的调试,我不认为这可能是因为模型本身的功能会导致问题。

这是问题函数

def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        if not self.room_id:
            self.room_id = self.game_id
            self.save()

我删除该功能后,其他所有功能均正常工作

0 个答案:

没有答案