#python #django #django-channels
#python #django #django-channels
Вопрос:
Я разрабатываю шахматную игру на Django, используя каналы Django. Вот соответствующие части GameConsumer
class GameConsumer(AsyncJsonWebsocketConsumer):
async def disconnect(self, code):
await self.disconn()
await self.opp_offline()
async def opp_offline(self):
await self.channel_layer.group_send(
str(self.game_id),
{
"type": "offline.opp",
'sender_channel_name': self.channel_name
}
)
async def offline_opp(self,event):
if self.channel_name != event['sender_channel_name']:
await self.send_json({
"command":"opponent-offline",
})
print("sending offline")
@database_sync_to_async
def disconn(self):
user = self.scope["user"]
game = Game.objects.all().filter(id=self.game_id)[0]
if game.opponent == user:
game.opponent_online = False
print("Setting opponent offline")
elif game.owner == user:
game.owner_online = False
print("Setting owner offline")
game.save()
Итак, я хочу уведомить другого онлайн-пользователя (если таковой имеется) о том, что их оппонент отключился. Итак, вот случай, в котором возникает проблема:
- Подключается первый пользователь. Это показывает, что его оппонент еще не подключился, и говорит ему подождать.
- Подключается второй пользователь. Игра начинается для них обоих.
- Теперь первый пользователь отключается до того, как были сделаны какие-либо ходы. Второй пользователь не получает уведомление пользователя об отключении. Но если это было наоборот, т.Е. Второй пользователь отключается, тогда первый пользователь получает уведомление.
- Но если был сделан ход, тогда все работает нормально.
Пытаюсь выяснить, где возникает проблема.
Вы можете просмотреть полный код потребителя здесь
Комментарии:
1. Можете ли вы добавить
connect
метод вашего потребителя?2. В конце я добавил ссылку для всего потребителя. Я не думал, что это будет актуально
3. Весь проект находится на github на случай, если кто-либо из вас захочет получить дополнительные разъяснения.