Django频道代码正在使用Chrome而不是Firefox

时间:2016-07-08 17:43:59

标签: django firefox django-channels

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

  1. 在连接到频道/ websocket的新连接上,服务器会检查等候室中是否至少有三个人(在consumer.py中)。
  2. 如果至少有三个人在场,它会使用群组功能向频道/ websocket广播消息,告诉他们重定向。
  3. 客户端收到消息,并在javascript中执行重定向。
  4. 以下是调试问题所采取的步骤:

    1. 该代码适用于Firefox以外的浏览器(例如Chrome)。
    2. 如果到达候诊室的前两个客户端是Firefox而最后一个(触发服务器)是Chrome,则代码可以正常工作。它重定向所有三个客户端。
    3. 如果前两个客户端是Chrome,而最后一个客户端(触发服务器)是Firefox,它会重定向Chrome客户端,但不会重定向Firefox客户端。
    4. 问题不太可能是javascript运行重定向,因为用简单的警报消息替换代码(在客户端收到Group语句时)也无法在Firefox中运行(但在Chrome中可以正常工作)。就好像Firefox客户端在触发服务器的客户端时从未收到Group消息。
    5. 聊天使用频道并适用于所有浏览器,包括Firefox。它成功连接,发送消息,接收消息和断开连接。
    6. 基于这些调试步骤,我认为当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);        
      
      };});
      

0 个答案:

没有答案