握手后 Django 通道 websocket 断开连接
Django channels websocket disconnects after handshake
我正在按照 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 版本。那么我该怎么做?
原来是 Google Chrome 更新问题。如果我能做到的话,返回一个版本可能会解决问题,但这就是问题所在,因为我在 Mozilla 上尝试过它,它仍然很有效。
添加到上面的@Vasil 回答中,当 localhost 用作 运行ning django 项目的域名时,这似乎是 Chrome 中的一个问题。如果您 运行 使用 IP 而不是 Localhost 的项目,Chrome 不会导致任何问题。
如果在 URL:
的末尾添加斜杠 +'/'
可以修复错误
var chatsock = new WebSocket(ws_scheme + '://' + window.location.host + window.location.pathname + '/');
在大多数情况下,缺少 /
结尾会导致 Chrome 浏览器出现问题,但在 Firefox 中工作正常
我正在按照 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 版本。那么我该怎么做?
原来是 Google Chrome 更新问题。如果我能做到的话,返回一个版本可能会解决问题,但这就是问题所在,因为我在 Mozilla 上尝试过它,它仍然很有效。
添加到上面的@Vasil 回答中,当 localhost 用作 运行ning django 项目的域名时,这似乎是 Chrome 中的一个问题。如果您 运行 使用 IP 而不是 Localhost 的项目,Chrome 不会导致任何问题。
如果在 URL:
的末尾添加斜杠+'/'
可以修复错误
var chatsock = new WebSocket(ws_scheme + '://' + window.location.host + window.location.pathname + '/');
在大多数情况下,缺少 /
结尾会导致 Chrome 浏览器出现问题,但在 Firefox 中工作正常