提问人:Kanagat 提问时间:11/9/2023 更新时间:11/9/2023 访问量:14
在 django websocket 中访问数据库时,返回不正确的数据
When accessing the database in the django websocket, incorrect data is returned
问:
我正在为 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}
}
)
答: 暂无答案
评论