2

我正在使用 Django 和 Channels(Django 的新 websocket 实现)编写一个聊天应用程序。用户首先进入等候室,直到至少有 3 人加入,然后他们被引导到聊天室。该代码适用于 Chrome,但不适用于 Firefox。下面是它的工作原理:

  1. 在新连接到通道/websocket 时,服务器会检查是否至少三个人在等候室(在 consumer.py 中)。
  2. 如果至少有三个人在场,它会使用 Group 函数向频道/websocket 广播一条消息,告诉他们重定向。
  3. 客户端接收到消息并在 javascript 中执行重定向。

以下是我为调试问题所采取的步骤:

  1. 该代码适用于 Firefox 以外的浏览器(例如 Chrome)。
  2. 如果到达等候室的前两个客户端是 Firefox,而最后一个(触发服务器)是 Chrome,则该代码有效。它重定向所有三个客户端。
  3. 如果前两个客户端是 Chrome,最后一个客户端(触发服务器)是 Firefox,它会重定向 Chrome 客户端,而不是 Firefox 客户端。
  4. 问题不太可能与运行重定向的 javascript 有关,因为用简单的警报消息替换代码(在客户端收到 Group 语句后)在 Firefox 中也不起作用(但在 Chrome 中起作用)。当 Firefox 客户端是触发服务器的客户端时,就好像 Firefox 客户端永远不会收到 Group 消息。
  5. 聊天使用频道并适用于包括 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);        

};});
4

0 回答 0