在 django websocket 中访问数据库时,返回不正确的数据

When accessing the database in the django websocket, incorrect data is returned

提问人:Kanagat 提问时间:11/9/2023 更新时间:11/9/2023 访问量:14

问:

我正在为 django 和频道上的纸牌浏览器游戏编写一个 websocket。当回合结束时,结果被计算,计算本身正常工作,甚至将计算结果保存在数据库中。但在下一轮结束时,当访问数据库时,它会返回上一轮之前的数据。也就是说,如果在第一轮开始时每个人都得 0 分,最后有人得 3 分,那么在下一轮结束时,从数据库计算结果时返回 0 分。尽管在同一轮开始时,所有玩家都收到了从数据库收到的数据,表明有人有 3 分。我不明白为什么会发生这种情况,我没有连接任何缓存。

在这里你可以看到整个项目的代码。

下面是用于计算结果的 websocket 方法的代码。问题出在返回给玩家的数据上:

 async def calculate_results(self, event):
    game = await database_sync_to_async(Game.objects.get)(
        id=self.game_id
    )
    players = await database_sync_to_async(
        lambda: list(Player.objects.filter(game=game))
    )()
    self.round_num = await get_round_num(game)
    for player in players:
        round = await database_sync_to_async(Round.objects.get)(
            game=game,
            round_num=self.round_num
        )
        association = await database_sync_to_async(Association.objects.get)(
            round=round,
            player=player
        )
        choices = await database_sync_to_async(
            lambda: list(Choice.objects.filter(
                card=association.card, round=round))
        )()
        data = {}

        leader = await database_sync_to_async(lambda: round.leader)()
        points = 0

        if player == leader:
            who_chose = []

            choices_count = len(choices)
            players_count = await database_sync_to_async(game.players.count)()

            if 0 < choices_count < players_count - 1:
                points += 3 + choices_count
                player.points += points
                who_chose = await database_sync_to_async(
                    lambda: [ch.player.id for ch in choices]
                )()

        else:
            leader_association_card = await database_sync_to_async(
                lambda: Association.objects.get(
                    round=round, player=leader).card
            )()
            pl_choice_card = await database_sync_to_async(
                lambda: Choice.objects.get(round=round, player=player).card
            )()
            guess_right = False

            if leader_association_card.id == pl_choice_card.id:
                points += 3
                guess_right = True

            points += len(choices)
            player.points += points

            who_chose = await database_sync_to_async(lambda: [ch.player.id for ch in choices])()
            data.update({'guess_right': guess_right})

        await database_sync_to_async(player.save)()

        data.update({"who_chose_your_cards": who_chose,
                    "points_for_round": points, "all_points": player.points})

        if player.points >= game.points_to_win:
            game.status = GameStatus.FINISHED
            if game.winner:
                game.winner = await database_sync_to_async(
                    lambda: player if player.points > game.winner.points else game.winner
                )()
            else:
                game.winner = player
            await database_sync_to_async(game.save)()

        await self.channel_layer.group_send(
            f"player_{player.id}",
            {
                'type': 'send_message',
                'data': data
            }
        )

    winner = await database_sync_to_async(lambda: game.winner)()
    if winner:
        await self.channel_layer.group_send(
            "public_room",
            {
                "type": "send_message",
                "data": {"winner": winner.id}
            }
        )
django 数据库 异步 websocket django 通道

评论


答: 暂无答案