【问题标题】:Websocket using Django Channels使用 Django 通道的 Websocket
【发布时间】:2017-06-08 15:25:50
【问题描述】:

我正在尝试使用 Django 通道与浏览器建立 websocket 连接。 websocket连接服务器失败:

[2017/01/23 23:51:50] HTTP GET / 200 [0.03, 127.0.0.1:60445]
[2017/01/23 23:51:51] WebSocket HANDSHAKING /chat/ [127.0.0.1:60451]
[2017/01/23 23:51:56] WebSocket DISCONNECT /chat/ [127.0.0.1:60451]

用于 websocket 的 Javascript:

    socket = new WebSocket("ws://" + window.location.host + "/chat/");
    socket.onmessage = function (e) {
        alert(e.data);
    };
    socket.onopen = function () {
        socket.send("hello world");
    };
    // Call onopen directly if socket is already open
    if (socket.readyState == WebSocket.OPEN) socket.onopen();

settings.py

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgiref.inmemory.ChannelLayer",
        "ROUTING": "django_chat_server.routing.channel_routing",
    }
}

路由.py

channel_routing = {
    # Wire up websocket channels to our consumers:
    'websocket.connect': ws_add,
    'websocket.receive': ws_message,
    'websocket.disconnect': ws_disconnect,
}

在加载页面时,ws_add 会启动,但连接最终会断开。关于如何调试这个或问题可能是什么的任何线索。

我正在使用命令python manage.py runserver 运行服务器。

编辑: 降级到twisted 版本 16.2.0。没用。

【问题讨论】:

    标签: django websocket django-channels


    【解决方案1】:

    您还应该有一个 websocket.connect 的消费者并接受连接,只有在接受连接后,协议服务器才会完成 websocket 握手

    channel_routing = {
        "websocket.connect": consumers.ws_connect,
    }
    

    consumers.py

    def ws_connect(message):
        message.reply_channel.send({
            'accept': True
    })
    

    http://channels.readthedocs.io/en/latest/releases/1.0.0.html#websocket-accept-reject-flow

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 2017-12-27
      • 1970-01-01
      • 2019-01-12
      • 2019-05-31
      • 2020-07-17
      • 2023-02-25
      • 2019-04-27
      • 2020-11-30
      相关资源
      最近更新 更多