Django Channels - 未执行连接
Posted
技术标签:
【中文标题】Django Channels - 未执行连接【英文标题】:Django Channels - connected isn't executed 【发布时间】:2017-08-03 13:27:44 【问题描述】:您好,我正在从 django 频道的创建者那里复制 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]
谁会认为是好的ofcourse...但是我在我的连接功能我有一个打印(“********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'])
Heres 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");
【问题讨论】:
【参考方案1】:Websocket 路径应该在服务器端和客户端匹配。在服务器端,你有/chat-stream/
和在客户端/chat/stream
。这些应该匹配。另外,请确保不要忘记尾随斜杠为django explicitly requires it。
【讨论】:
是的,谢谢我前段时间注意到了:p,但是 +1 看到了 :) @Bolian:如果您找到答案,随时欢迎您回答自己的问题,可能会对遇到同样问题的人有所帮助...以上是关于Django Channels - 未执行连接的主要内容,如果未能解决你的问题,请参考以下文章
Django 通道 websocket 连接和断开连接(Nginx + Daphne + Django + Channels)
未调用 Django Channels WebSocketConsumer 的 Disconnect() 方法
Django Channels 从 HTTP 握手请求(升级请求)中检索 cookie
Django Channels Websockets 立即连接和断开连接