问题描述
我目前正在使用通道在我的 Django 应用程序上开发“等待队列”应用程序。 我有一个使用 Redis 的通道层来处理组内的连接。 我还在我的数据库中使用一个模型来跟踪队列中的用户数量。 我的问题是是否有一种更简单、更具可扩展性的方法。 在此过程中会有任何问题吗?
class ChatConsumer(AsyncWebsocketConsumer):
@database_sync_to_async
def get_waiting_room(self):
return WaitingRoom.objects.all().count()
@database_sync_to_async
def add_to_waiting_room(self, name):
return WaitingRoom.objects.create(name=name)
@database_sync_to_async
def remove_from_waiting_room(self, name):
return WaitingRoom.objects.filter(name=name).delete()
async def connect(self):
self.waiting_list = 'waiting_list'
await self.channel_layer.group_add(
self.waiting_list, self.channel_name)
await self.accept()
async def receive(self, text_data):
self.text_data = json.loads(text_data)
await self.add_to_waiting_room(self.text_data['user'])
users = await self.get_waiting_room()
await self.channel_layer.group_send(self.waiting_list, {
'type': 'user_list',
'users': str(users)
})
async def disconnect(self, close_code):
await self.remove_from_waiting_room(name=self.text_data['user'])
await self.channel_layer.group_discard(
self.waiting_list,
self.channel_name)
users = await self.get_waiting_room()
await self.channel_layer.group_send(self.waiting_list, {
'type': 'user_list',
'users': str(users)
})
async def user_list(self, event):
users = event['users']
await self.send(text_data=users)
当用户连接时,他们被添加到channel_layer(Redis)中的一个组并接受连接,当我的用户单击一个按钮时,它会向通道发送请求并将它们添加到等候室(我的Django模型),在断开连接,它删除模型实例并向通道发送一个带有更新的“用户”计数的信号。
有没有更简单的方法来做到这一点? 这种方法会在路上造成任何障碍吗?
提前致谢。
1楼
浏览器并不总是干净地关闭 websocket 连接,所以我认为 disconnect() 有可能永远不会被触发。 因此,您可能会在数据库中获取陈旧数据,或者连续调用 .connect() 两次,从而导致完整性错误。