对数据库的更新从套接字上的同一会话中删除旧数据
Updates to the database deletes older data from the same session on the socket
我正在制作一款您可以在线玩的井字游戏。我想保存每个用户的赢/输计数,我正在使用 Django 3.2,频道 3 和 channels_presence 与 Python 3.9
我已经成功构建了socket和客户端,现在你可以尽情地玩游戏了。
问题是我尝试保存的分数存储在数据库中,但在另一场比赛后分数returns归零。
所以如果两个用户在一个房间里玩并且用户 1 赢了 2 场比赛,分数就会更新,然后如果另一个用户赢了一场比赛他们的分数将是 1 而用户 1 的分数将被重置为零
我的用户模型
class CustomUser(AbstractUser):
won_games = models.IntegerField(default=0)
lost_games = models.IntegerField(default=0)
draw_games = models.IntegerField(default=0)
def win(self):
self.won_games += 1
self.save()
def lose(self):
self.lost_games += 1
self.save()
def draw(self):
self.draw_games += 1
self.save()
我已经将它放入我的 consumers.py
的接收函数中
class GameConsumer(WebsocketConsumer):
#some code
def receive(self, text_data):
if text_data['type'] == 'completed':
self_channel = Presence.objects.get(channel_name=self.channel_name)
competitor = self_channel.room.presence_set.filter(
~Q(channel_name=self_channel)
).first().user
user = self.scope['user']
if competitor:
competitor.win()
if user.is_authenticated:
user.lose()
return
我依靠其他用户的消息来确认中奖,因此没有人可以向套接字发送假中奖
我已经尝试从数据库中删除所有用户,迁移我的数据库,改变 属性 won_games 的方式,如您所见,但问题是它 returns输完恢复默认
如果你能帮助我,这里是完整的源代码
https://github.com/ahmedyasserays/XO-online
所以我已经解决了这个问题,问题出在 user = self.scope['user']
部分。
当你现在启动与消费者的连接时,一个新的消费者实例从你的 class 的内存中创建,具有像这样的一些属性 self.scope
用从另一个实例赢取的新数据更新数据库不会不会影响所有实例,相反,其他实例仍然会有尚未更新其数据的对象,在我们的例子中,它是 self.scope['user']
,它仍然具有 won_games 的旧值,当我们尝试保存它,所以修复只是在应用 user.lose()
方法
之前添加 user = CustomUser.objects.get(id=user.id)
我正在制作一款您可以在线玩的井字游戏。我想保存每个用户的赢/输计数,我正在使用 Django 3.2,频道 3 和 channels_presence 与 Python 3.9
我已经成功构建了socket和客户端,现在你可以尽情地玩游戏了。
问题是我尝试保存的分数存储在数据库中,但在另一场比赛后分数returns归零。
所以如果两个用户在一个房间里玩并且用户 1 赢了 2 场比赛,分数就会更新,然后如果另一个用户赢了一场比赛他们的分数将是 1 而用户 1 的分数将被重置为零
我的用户模型
class CustomUser(AbstractUser):
won_games = models.IntegerField(default=0)
lost_games = models.IntegerField(default=0)
draw_games = models.IntegerField(default=0)
def win(self):
self.won_games += 1
self.save()
def lose(self):
self.lost_games += 1
self.save()
def draw(self):
self.draw_games += 1
self.save()
我已经将它放入我的 consumers.py
的接收函数中class GameConsumer(WebsocketConsumer):
#some code
def receive(self, text_data):
if text_data['type'] == 'completed':
self_channel = Presence.objects.get(channel_name=self.channel_name)
competitor = self_channel.room.presence_set.filter(
~Q(channel_name=self_channel)
).first().user
user = self.scope['user']
if competitor:
competitor.win()
if user.is_authenticated:
user.lose()
return
我依靠其他用户的消息来确认中奖,因此没有人可以向套接字发送假中奖
我已经尝试从数据库中删除所有用户,迁移我的数据库,改变 属性 won_games 的方式,如您所见,但问题是它 returns输完恢复默认
如果你能帮助我,这里是完整的源代码 https://github.com/ahmedyasserays/XO-online
所以我已经解决了这个问题,问题出在 user = self.scope['user']
部分。
当你现在启动与消费者的连接时,一个新的消费者实例从你的 class 的内存中创建,具有像这样的一些属性 self.scope
用从另一个实例赢取的新数据更新数据库不会不会影响所有实例,相反,其他实例仍然会有尚未更新其数据的对象,在我们的例子中,它是 self.scope['user']
,它仍然具有 won_games 的旧值,当我们尝试保存它,所以修复只是在应用 user.lose()
方法
user = CustomUser.objects.get(id=user.id)