Django Channels 错误:失败:在建立连接之前关闭 WebSocket
Posted
技术标签:
【中文标题】Django Channels 错误:失败:在建立连接之前关闭 WebSocket【英文标题】:Django Channels error : failed: WebSocket is closed before the connection is established 【发布时间】:2017-05-24 01:16:22 【问题描述】:我正在将 Django 与 django 频道一起使用。我将离开 Andrew Godwins django 频道示例“MultiChat”示例。我正在使用 Webfaction 和 Putty 来尝试让它运行,这是我得到的代码。
settings.py
redis_host = os.environ.get('REDIS_HOST', 'localhost')
CHANNEL_LAYERS =
"default":
# This example app uses the Redis channel layer implementation asgi_redis
"BACKEND": "asgi_redis.RedisChannelLayer",
"CONFIG":
"hosts": [(redis_host, 27411)],
,
"ROUTING": "myproject.routing.channel_routing",
,
我确实有一个问题,如果我在我的网站的 IP 地址中显示 localhost,或者我在使用 redis 时是否将其保留为 localhost?
至于我的 index.html,我有这个不确定是否需要调整或更新此代码,感谢任何帮助。
% extends "base.html" %
% block title %MultiChat Example% endblock %
% block header_text %MultiChat Example% endblock %
% block content %
<ul class="rooms">
% for room in rooms %
<li class="room-link" data-room-id=" room.id "> room </li>
% empty %
<p class="empty">No chat rooms defined. Maybe make some in the <a href="% url 'admin:index' %">admin</a>?</p>
% endfor %
</ul>
<div id="chats">
</div>
% endblock %
% block extra_body %
<script>
$(function ()
// Correctly decide between ws:// and wss://
var ws_path = "/chat/stream/";
console.log("Connecting to " + ws_path);
var webSocketBridge = new channels.WebSocketBridge();
webSocketBridge.connect(ws_path);
// Handle incoming messages
webSocketBridge.listen(function(data)
// Decode the JSON
console.log("Got websocket message", data);
// Handle errors
if (data.error)
alert(data.error);
return;
// Handle joining
if (data.join)
console.log("Joining room " + data.join);
var roomdiv = $(
"<div class='room' id='room-" + data.join + "'>" +
"<h2>" + data.title + "</h2>" +
"<div class='messages'></div>" +
"<form><input><button>Send</button></form>" +
"</div>"
);
// Hook up send button to send a message
roomdiv.find("form").on("submit", function ()
webSocketBridge.send(
"command": "send",
"room": data.join,
"message": roomdiv.find("input").val()
);
roomdiv.find("input").val("");
return false;
);
$("#chats").append(roomdiv);
// Handle leaving
else if (data.leave)
console.log("Leaving room " + data.leave);
$("#room-" + data.leave).remove();
// Handle getting a message
else if (data.message || data.msg_type != 0)
var msgdiv = $("#room-" + data.room + " .messages");
var ok_msg = "";
// msg types are defined in chat/settings.py
// Only for demo purposes is hardcoded, in production scenarios, consider call a service.
switch (data.msg_type)
case 0:
// Message
ok_msg = "<div class='message'>" +
"<span class='username'>" + data.username + "</span>" +
"<span class='body'>" + data.message + "</span>" +
"</div>";
break;
case 1:
// Warning / Advice messages
ok_msg = "<div class='contextual-message text-warning'>" + data.message +
"</div>";
break;
case 2:
// Alert / Danger messages
ok_msg = "<div class='contextual-message text-danger'>" + data.message +
"</div>";
break;
case 3:
// "Muted" messages
ok_msg = "<div class='contextual-message text-muted'>" + data.message +
"</div>";
break;
case 4:
// User joined room
ok_msg = "<div class='contextual-message text-muted'>" + data.username +
" joined the room!" +
"</div>";
break;
case 5:
// User left room
ok_msg = "<div class='contextual-message text-muted'>" + data.username +
" left the room!" +
"</div>";
break;
default:
console.log("Unsupported message type!");
return;
msgdiv.append(ok_msg);
msgdiv.scrollTop(msgdiv.prop("scrollHeight"));
else
console.log("Cannot handle message!");
);
// Says if we joined a room or not by if there is a div for it
inRoom = function (roomId)
return $("#room-" + roomId).length > 0;
;
// Room join/leave
$("li.room-link").click(function ()
roomId = $(this).attr("data-room-id");
if (inRoom(roomId))
// Leave room
$(this).removeClass("joined");
webSocketBridge.send(
"command": "leave",
"room": roomId
);
else
// Join room
$(this).addClass("joined");
webSocketBridge.send(
"command": "join",
"room": roomId
);
);
// Helpful debugging
webSocketBridge.socket.onopen = function ()
console.log("Connected to chat socket");
;
webSocketBridge.socket.onclose = function ()
console.log("Disconnected from chat socket");
);
</script>
% endblock %
我的错误
(index):40 Connecting to /chat/stream
websocketbridge.js:118 WebSocket connection to 'ws://www.openchat.us/chat/stream' failed: Error during WebSocket handshake: Invalid status line
connect @ websocketbridge.js:118
(index):161 Disconnected from chat socket
websocketbridge.js:183 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
at ReconnectingWebsocket.send (http://www.openchat.us/static/channels/js/websocketbridge.js:183:12)
at WebSocketBridge.send (http://www.openchat.us/static/channels/js/websocketbridge.js:364:19)
at HTMLLIElement.<anonymous> (http://www.openchat.us/:149:37)
at HTMLLIElement.dispatch (http://www.openchat.us/static/channels/js/jquery-1.12.2.min.js:3:12444)
at HTMLLIElement.r.handle (http://www.openchat.us/static/channels/js/jquery-1.12.2.min.js:3:9173)
(index):1 WebSocket connection to 'ws://www.openchat.us/chat/stream' failed: WebSocket is closed before the connection is established.
2(index):161 Disconnected from chat socket
2websocketbridge.js:118 WebSocket connection to 'ws://www.openchat.us/chat/stream' failed: Error during WebSocket handshake: Invalid status line
connect @ websocketbridge.js:118
(index):161 Disconnected from chat socket
【问题讨论】:
【参考方案1】:如果你的redis和你的wepapp在同一个地方,你可以设置localhost
为redis的IP地址。
settings
的端口相同?
【讨论】:
嗨,Mathieu 是的,redis 安装在 webfaction 提供的机器上redis 的问题是当我输入命令 ./redis-server 时,它会将其启动到 127.0.0.1:6379 但是当使用 django 频道时,我必须输入命令 daphne -p myproject.asgi:channel_layer # the port作为来自 webfaction 的 websocket 应用程序的端口,因此我想用 ./redis-server -p myportumberhere 启动 redis 我当前的错误是:Connecting to ws://www.openchat.us/chat/stream/reconnecting-websocket.min.js:1 WebSocket connection to 'ws://www.openchat. us/chat/stream/' 失败:WebSocket 握手期间出错:打开无效状态行 @ reconnecting-websocket.min.js:1 a @ reconnecting-websocket.min.js:1 (anonymous) @ (index):49 i @ jquery-1.12.2.min.js:2 fireWith @ jquery-1.12.2.min.js:2 准备好了 @ jquery-1.12.2.min.js:2 K @ jquery-1.12.2.min.js:2 (index):164 与聊天套接字断开连接以上是关于Django Channels 错误:失败:在建立连接之前关闭 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Django channels_redis 与 Heroku Redis 建立连接
使用来自外部Consumer类的Django Channels发送消息
Django Channels 2.4 和 Websockets 在 Elastic Beanstalk 和 ElastiCache 上给出 502 错误