我正在使用 Django 和 Channels(Django 的新 websocket 实现)编写一个聊天应用程序。用户首先进入等候室,直到至少有 3 人加入,然后他们被引导到聊天室。该代码适用于 Chrome,但不适用于 Firefox。下面是它的工作原理:
- 在新连接到通道/websocket 时,服务器会检查是否至少三个人在等候室(在 consumer.py 中)。
- 如果至少有三个人在场,它会使用 Group 函数向频道/websocket 广播一条消息,告诉他们重定向。
- 客户端接收到消息并在 javascript 中执行重定向。
以下是我为调试问题所采取的步骤:
- 该代码适用于 Firefox 以外的浏览器(例如 Chrome)。
- 如果到达等候室的前两个客户端是 Firefox,而最后一个(触发服务器)是 Chrome,则该代码有效。它重定向所有三个客户端。
- 如果前两个客户端是 Chrome,最后一个客户端(触发服务器)是 Firefox,它会重定向 Chrome 客户端,而不是 Firefox 客户端。
- 问题不太可能与运行重定向的 javascript 有关,因为用简单的警报消息替换代码(在客户端收到 Group 语句后)在 Firefox 中也不起作用(但在 Chrome 中起作用)。当 Firefox 客户端是触发服务器的客户端时,就好像 Firefox 客户端永远不会收到 Group 消息。
- 聊天使用频道并适用于包括 Firefox 在内的所有浏览器。它成功连接、发送消息、接收消息和断开连接。
基于这些调试步骤,我认为当 Firefox 发起执行组重定向的服务器代码时出现问题。您对可能出现的问题有什么建议吗?你有什么建议可以帮助确定问题吗?
这是我认为导致问题的 consumer.py 中的代码:
@channel_session_user_from_http
@channel_session
def wait_connect(message):
try:
wait_room, created = WaitRoom.objects.get_or_create(title=title)
except WaitRoom.DoesNotExist:
log.debug('ws room does not exist title=%s', title)
return
Group('wait-'+title, channel_layer=message.channel_layer).add(message.reply_channel)
wait_user,created = wait_room.users.get_or_create(user=message.user)
userlist = WaitUser.objects.filter(wait_room=wait_room,is_active=1)
if len(userlist)>=3:
t = {t['url']='redirecturl'}
Group('wait-'+title, channel_layer=message.channel_layer).send({'text': json.dumps(t)})
这是执行重定向的 javascript 代码:
$(function() {
var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
var chatsock = new ReconnectingWebSocket(ws_scheme + '://' + window.location.host + window.location.pathname);
chatsock.onmessage = function(message) {
var data = JSON.parse(message.data);
window.location.replace(data.url);
};});