使用Django(Python)库通道, 我们已经创建了具有聊天功能的网络服务。
其中,利用消费者的功能, 我们已经创建了一个聊天室和一个房间列表获取过程。
在前端获取会议室列表(网络套接字通信)时,我们可以在一个浏览器窗口上进行连接,但无法通过启动另一浏览器或chrome的另一个帐户来获得会议室列表。在使用浏览器的房间列表中,未正确处理websocket的连接(或在连接后接收)。
我也想从其他浏览器获取房间列表, 请教解决方法。
consumer.py
class RoomListConsumer(AsyncWebsocketConsumer):
groups = ['broadcast']
async def connect(self):
self.scope["session"].save()
self.room = []
self.room_group_name = "room_list" + self.scope['url_route']['kwargs']['id']
await self.channel_layer.group_add(
'room_list',
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
self.scope["session"].save()
await self.channel_layer.group_discard(
'room_list',
self.channel_name
)
await self.close()
async def receive(self, text_data):
self.scope["session"].save()
await self.setRoomList()
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'list': self.room
}
)
async def chat_message(self, event):
await self.send(text_data=json.dumps({
'type': 'chat_message',
'list': self.room
}))
@database_sync_to_async
def setRoomList(self):
# Set Room List
routing.py
websocket_urlpatterns = [
url(r'^chat/list/(?P<id>[^/]+)/$', RoomListConsumer),
url(r'^chat/(?P<id>[^/]+)/(?P<room_name>[^/]+)/$', ChatConsumer)
]
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter(
websocket_urlpatterns
)
),
})