2017-10-04 199 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不會引起任何問題。