【问题标题】:Django channels websocket disconnects after handshake握手后 Django 通道 websocket 断开连接
【发布时间】:2017-10-04 09:36:29
【问题描述】:

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

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

我的 consumer.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 版本。那么有什么想法我应该怎么做?

【问题讨论】:

    标签: python django websocket disconnect django-channels


    【解决方案1】:

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

    【讨论】:

    • 是否有任何关于何时修复此问题的消息。已经两个月了,我仍然看到这种行为
    • 当我开发我的项目时,它原来是 localhost 和 chrome 的问题。我相信,如果您使用您的 IP 地址为您的项目提供服务,那会很好 - python manage.py runserver
    • 这是有用的信息,请您参考一下您是如何缩小范围的?
    【解决方案2】:

    添加到上面的@Vasil 答案,当 localhost 用作正在运行的 django 项目的域名时,这似乎是 Chrome 中的一个问题。如果您使用 IP 而不是 Localhost 运行项目,Chrome 不会导致任何问题。

    【讨论】:

      【解决方案3】:

      如果您在 URL 的末尾添加一个斜杠 +'/',则可以修复该错误:

      var chatsock = new WebSocket(ws_scheme + '://' + window.location.host + window.location.pathname + '/');
      

      在大多数情况下,最后缺少/ 会导致 Chrome 浏览器出现问题,但在 Firefox 中可以正常工作

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 2021-10-06
        • 2019-05-28
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 2017-01-25
        相关资源
        最近更新 更多