2017-10-04 193 views
0

我正在构建一个简单的聊天室,遵循django渠道的示例。一切都像昨天的魅力一样,我设法创造了一个聊天室,甚至设法在那里聊天。突然间,我的代码没有任何变化,Websocket在连接和握手之后立即断开连接。Django渠道握手后websocket断开

My setup: 
Django == 1.10.5 
Python == 2.7 
channels == 1.1.8 
asgi-redis == 1.4.2 
daphne == 1.3.0 

我consumers.py看起来是这样的:

consumers.py: 
@channel_session 
def ws_connect(message): 
    room = message.content['path'].strip("/") 
    message.channel_session['room'] = room 
    Group("chat").add(message.reply_channel) 
    message.reply_channel.send({"accept": True}) 

以及前端部分:

$(function() { 
     // When we're using HTTPS, use WSS too. 
     var ws_scheme = window.location.protocol = "ws"; 
     var chatsock = new WebSocket(ws_scheme + '://' + window.location.host + window.location.pathname); 


     chatsock.onmessage = function(message) { 
      var data = JSON.parse(message.data); 
      var chat = $("#chat"); 
      var ele = $('<tr></tr>'); 
      console.log(data); 

      ele.append(
       $("<td></td>").text(data.timestamp) 
      ); 
      ele.append(
       $("<td></td>").text(data.handle) 
      ); 
      ele.append(
       $("<td></td>").text(data.message) 
      ); 

      chat.append(ele) 
     }; 

     $("#chatform").on("submit", function(event) { 
      var time = new Date(); 
      var string = time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds(); 
      // var timestamp = time.getHourMinuteSecond(); 
      var message = { 
       timestamp: string, 
       handle: $('#handle').val(), 
       message: $('#message').val() 
      }; 
      console.log("submit"); 
      chatsock.send(JSON.stringify(message)); 
      $("#message").val('').focus(); 
      return false; 
     }); 
    }); 

也许在一些技术的更新了。我正在努力弄清楚为什么会发生这种情况。在settings.py我对redis的沟道层以下配置:

CHANNEL_LAYERS = { 
    "default": { 
     "BACKEND": "asgi_redis.RedisChannelLayer", 
     "CONFIG": { 
      "hosts": [("localhost", 6379)], 
     }, 
     "ROUTING": "config.routing.channel_routing", 
    }, 
} 

我有通知该握手之后也断开另一个的WebSocket逻辑。我试着将Django更新为1.11。但没有运气。在聊天应用程序的routing.py中:

chat_routing = [ 
    route("websocket.connect", consumers.ws_connect), 
    route("websocket.receive", consumers.ws_message), 
    route("websocket.disconnect", consumers.ws_disconnect), 
] 

我在Linux Ubuntu 16.04上运行,我在过去几天更新的唯一东西是Chrome版本。所以有什么想法我该怎么做?

回答

1

原来是Chrome浏览器的更新问题。如果我能做到这一点,可能会回到一个版本将解决问题,但这是问题,因为我在Mozilla上尝试它,它仍然像魅力一样工作。

+0

有没有什么时候会修复这个问题。它已经两个月了,我仍然看到这种行为 –

+0

随着我开发我的项目,它变成了localhost和chrome的问题。我相信,如果你使用你的IP地址为你的项目提供服务,它将会很好 - python manage.py runserver

+0

呵呵...这是很棒的信息!谢谢。 –

0

添加上面的@Vasil答案时,在将localhost用作正在运行的django项目的域名时,这似乎是Chrome中的问题。如果您使用IP而不是本地主机运行项目,则Chrome不会引起任何问题。