使用Django Channels 2.1.1和Django 2.0,我正在建立一个客户按下按钮并进入聊天室的网站,其中有一名员工。我是从Andrew Godwin的multichat例子开始的。
简而言之:我无法弄清楚如何正确地将员工添加到组中,以便他可以在聊天室中接收和发送消息。
我在图层,群组和频道上阅读了documentation。我不能说我对这些概念非常清楚,但我认为一个频道属于个人用户,一个群组属于聊天室或其等价物,用户以某种方式组合在一起,而层是通过其进行通信的媒介发生了。
使用这种理解,我能做的最好的就是添加到这样的join_room(self, room_id)
函数,这可能是完全错误的事情:
async def join_room_client(self, room_id):
...
# Added to find all staff who are logged in
authenticated_staff = get_all_logged_in_users()
# Added to list staff who are in less than 3 chatrooms
available_staff = []
if len(authenticated_staff) > 0:
for staff in authenticated_staff:
if staff in users_and_rooms and len(users_and_rooms[staff]) in range(3):
available_staff.append(staff)
random_available_staff = random.choice(available_staff)
# I thought receive_json() would look for "content", but I was wrong
content = {
"command": "join",
"join": room_id,
"type": "chat.join",
"room_id": room_id,
"text": "Hello there!",
"username": random_available_staff,
"title": room.title,
}
# Helps to open room in conjunction with chat_join()?
from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
await channel_layer.send(users_and_channels[random_available_staff], content)
# This allows staff to receive messages in the chatroom but not to reply.
await self.channel_layer.group_add(
room.group_name,
# The line below is staff's channel name, eg: specific.PhCvZeuI!aCOgcyvgDanT
# I got it by accessing self.channel_name in connect(self)
users_and_channels[random_available_staff],
)
else:
print("Staff are not yet ready.")
else:
print("There are no staff available.")
使用此代码,会在员工的浏览器上自动打开房间。他可以看到客户的消息,但尝试回复会引发"ROOM_ACCESS_DENIED"
,这意味着他没有被添加到房间。但我以为我是用group.add(room.group_name, users_and_channels[random_available_staff])
完成的。
无论如何,据推测,当客户按下按钮时,最有效的方式是将关于聊天室的数据发送到工作人员receive_json(self, content)
的实例,对吧?但该函数通过以下方式从template中的Javascript接收数据:
socket.send(JSON.stringify({
"command": "join",
"room": roomId
})
如果可能的话,如何使用consumer.py本身的消费者向员工的receive_json()
发送有关客户聊天室的数据?如果没有,我应该使用其他什么方法?
答案 0 :(得分:0)
原始join_room(self, room_id)
包含以下两个关键线:
# Store that we're in the room
self.rooms.add(room_id)
问题是,我无法弄清楚将这条线放在哪里,以便增加员工而不是客户。经过大量的实验(和粗心大意)后,我发现最好的地方是chat_join()
:
async def chat_join(self, event):
...
# Right at the end
self.rooms.add(event["room_id"])
因为chat_join()
在join_room()
之后发挥作用,它允许我们在他自己的循环而不是客户上添加员工。
但是,如果你将这些用户添加到一个房间,那么这是做什么的:
await self.channel_layer.group_add(
room.group_name,
self.channel_name,
)
根据documentation,我认为一个房间是一个团体。我想我误解或误解了它。我回去再次阅读文档,但我仍然不知道两者之间有什么区别。