python - Django Channels - 连接未执行

标签 python django websocket django-channels

我正在从 Django channel 的创建者那里复制 GitHub 项目 multichat 的部分内容。

我正在对代码进行一些细微的更改,例如不使用 jQuery、重命名一些使用者等。

运行代码时我实际上没有任何错误,但是当我加入页面并且 JS 创建一个 websocket 时,它会简单地说

[2017/08/03 13:13:48] WebSocket HANDSHAKING /chat/stream [127.0.0.1:37070]
[2017/08/03 13:13:48] WebSocket CONNECT /chat/stream [127.0.0.1:37070]

当然,哪个人认为没问题...但是在我的连接函数中,我有一个 print("CONNECTED **"),在控制台中看不到它。当有人连接时,它只是不运行我告诉它的函数,但它仍然显示该人已连接并且不会抛出任何错误。

这是主要路由:

channel_routing = [
    include("crypto_chat.routing.websocket_routing", path=r"^/chat-stream/$"),
        include("crypto_chat.routing.chat_routing"),
]

从应用程序路由:

websocket_routing = [
    route("websocket.connect", ws_connect),
    route("websocket.receive", ws_receive),
    route("websocket.disconnect", ws_disconnect),
]

chat_routing = [
    route("chat.receive", chat_send, command="^send$"),
    route("chat.receive", user_online, command="^online$"),
    

连接消费者:

@channel_session_user_from_http
def ws_connect(message):
    # only accept connection if you have any rooms to join
    print("******************CONNECT*************************''")
    message.reply_channel.send({"accept": True})
    # init rooms - add user to the groups and pk num to the session
    message.channel_session['rooms'] = []
    for room in Room.objects.get(users=message.user):
        room.websocket_group.add(message.reply_channel)
        message.channel_session['rooms'].append(room.pk)

    print(message.channel_session['rooms'])

这是 JS(注意:我使用的是项目网站上也提供的 JS 扩展):

function send_msg(){
    var msg=document.getElementById('msg_input').value;
    console.log("sending msg" + msg);

    webSocketBridge.send({
                "command": "send",
                "room": "1",
                "message": msg
            });
}
    // logging
    var ws_path = "/chat/stream";
    console.log("connecting to " + ws_path);
    // connect
    var webSocketBridge = new channels.WebSocketBridge();
    webSocketBridge.connect(ws_path);
    // listen loop
    webSocketBridge.listen(function(data)
    {
        // read json file and act accordingly
        if(data.error){
            // post error message in chat
            console.log("Error - " + data.error);
            return;
        }
        // handle if the user comes back online
        if(data.online){
            console.log("User is online");
        }
        else if(data.offline){
            console.log("User offline");
        }
        else if(data.message){
            console.log("Got message");
        }
        else{  console.log("Unknown message type");  }
    });

    // Helpful debugging
webSocketBridge.socket.onopen = function () {
    console.log("Connected to chat socket");
};
webSocketBridge.socket.onclose = function () {
    console.log("Disconnected from chat socket");
}

最佳答案

Websocket 路径应在服务器端和客户端上匹配。在服务器端,您有 /chat-stream/ ,在客户端有 /chat/stream。这些应该匹配。另外,请确保不要忘记尾部斜杠 django explicitly requires it .

关于python - Django Channels - 连接未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45485635/

相关文章:

python - 创建 boost-python 嵌套命名空间

python - Django 为 QuerySet 获取可执行的原始 sql

django - 在特定时间段运行 celery 任务

javascript - 该解决方案可以安全地通过 webSoket 通信在网络上访问用户的私有(private)证书吗?

html - 基于源的安全模型是什么意思?

python - 模板不存在 : Wrong template path

Python 无法使用 multiprocessing.pool 分配内存

javascript - websocket php 与 Node js

python - Flask/SQLAlchemy 插入数据库

django - simplelazyobject 破坏模板过滤器