Django 3.1.5 和 Channels 3.0.3 websocket 问题
Django 3.1.5 and Channels 3.0.3 websocket problem
我正在将一个应用程序迁移到 Django 3.1.5 和通道 3.0.3,但我遇到了 websockets 在连接后大约 2 秒断开连接的问题。
这是我的消费者,它连接上了,但几秒钟后,它在没有触发断开连接的情况下断开连接
from channels.generic.websocket import JsonWebsocketConsumer
from django.utils import timezone
from asgiref.sync import async_to_sync
class SystemConsumer(JsonWebsocketConsumer):
groups = ["WSbroadcast","WSsystemAPP"]
def connect(self):
self.accept()
print('Websocket accepted: ' + str(self.scope))
def disconnect(self, close_code):
# Called when the socket closes
print('Websocket disconnected: ' + str(close_code))
asgi 文件如下所示:
import os
import django
from django.conf.urls import url
from django.core.asgi import get_asgi_application
# Fetch Django ASGI application early to ensure AppRegistry is populated
# before importing consumers and AuthMiddlewareStack that may import ORM
# models.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MainAPP.settings.development")
django.setup()
django_asgi_app = get_asgi_application()
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator,OriginValidator
from channels.routing import ProtocolTypeRouter, URLRouter
from MainAPP.consumers import SystemConsumer
application = ProtocolTypeRouter({
# Django's ASGI application to handle traditional HTTP requests
"http": django_asgi_app,
# WebSocket chat handler
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter([
url(r"^ws/System/$",SystemConsumer.as_asgi()),
])
)
),
})
JS 文件如下所示:
var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
const path = ws_scheme + '://' + window.location.host + "/ws/System/";
let wsSystem = new WebSocket(path);
console.log("Connecting to " + path);
wsSystem.onmessage = function (message) {
// Handle different actions
var payload = JSON.parse(message.data);
if (payload.action == "query_datetime") {
console.log("System UTC datetime is " + payload.date + " " + payload.time);
}else if (payload.action == "loading_status") {
var loading_status = payload.loading;
loading(loading_status);
}else {
console.log("Unknown action " + payload.action);
}
};
// Helpful debugging
wsSystem.onopen = function (event) {
console.log("Connected to "+path);
$("body").removeClass("no_websockets");
query_system_datetime();
};
wsSystem.onclose = function (event) {
console.log("Disconnected to system socket: " + event["code"]);
$("body").addClass("no_websockets");
};
wsSystem.onerror = function (event) {
console.log("Error: " + event);
$("body").addClass("no_websockets");
};
JS 向控制台写入 websockets 已连接,几秒钟后写入断开连接,错误代码为 1011。
谁能告诉我这里失败的原因是什么??我想如果 websocket 连接,路由和所有东西都可以,但它会在没有任何建议的情况下断开连接...
我应该安装 uvicorn 或类似软件吗??我正在使用 WIndows、Eclipse、PyDev 进行开发...
找到问题了!
Windows 上的 Redis 版本未升级到版本 5。
我从 here 安装了 Redis 版本 5.0.10,现在它连接并保持连接...
我正在将一个应用程序迁移到 Django 3.1.5 和通道 3.0.3,但我遇到了 websockets 在连接后大约 2 秒断开连接的问题。
这是我的消费者,它连接上了,但几秒钟后,它在没有触发断开连接的情况下断开连接
from channels.generic.websocket import JsonWebsocketConsumer
from django.utils import timezone
from asgiref.sync import async_to_sync
class SystemConsumer(JsonWebsocketConsumer):
groups = ["WSbroadcast","WSsystemAPP"]
def connect(self):
self.accept()
print('Websocket accepted: ' + str(self.scope))
def disconnect(self, close_code):
# Called when the socket closes
print('Websocket disconnected: ' + str(close_code))
asgi 文件如下所示:
import os
import django
from django.conf.urls import url
from django.core.asgi import get_asgi_application
# Fetch Django ASGI application early to ensure AppRegistry is populated
# before importing consumers and AuthMiddlewareStack that may import ORM
# models.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MainAPP.settings.development")
django.setup()
django_asgi_app = get_asgi_application()
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator,OriginValidator
from channels.routing import ProtocolTypeRouter, URLRouter
from MainAPP.consumers import SystemConsumer
application = ProtocolTypeRouter({
# Django's ASGI application to handle traditional HTTP requests
"http": django_asgi_app,
# WebSocket chat handler
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter([
url(r"^ws/System/$",SystemConsumer.as_asgi()),
])
)
),
})
JS 文件如下所示:
var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
const path = ws_scheme + '://' + window.location.host + "/ws/System/";
let wsSystem = new WebSocket(path);
console.log("Connecting to " + path);
wsSystem.onmessage = function (message) {
// Handle different actions
var payload = JSON.parse(message.data);
if (payload.action == "query_datetime") {
console.log("System UTC datetime is " + payload.date + " " + payload.time);
}else if (payload.action == "loading_status") {
var loading_status = payload.loading;
loading(loading_status);
}else {
console.log("Unknown action " + payload.action);
}
};
// Helpful debugging
wsSystem.onopen = function (event) {
console.log("Connected to "+path);
$("body").removeClass("no_websockets");
query_system_datetime();
};
wsSystem.onclose = function (event) {
console.log("Disconnected to system socket: " + event["code"]);
$("body").addClass("no_websockets");
};
wsSystem.onerror = function (event) {
console.log("Error: " + event);
$("body").addClass("no_websockets");
};
JS 向控制台写入 websockets 已连接,几秒钟后写入断开连接,错误代码为 1011。
谁能告诉我这里失败的原因是什么??我想如果 websocket 连接,路由和所有东西都可以,但它会在没有任何建议的情况下断开连接...
我应该安装 uvicorn 或类似软件吗??我正在使用 WIndows、Eclipse、PyDev 进行开发...
找到问题了!
Windows 上的 Redis 版本未升级到版本 5。
我从 here 安装了 Redis 版本 5.0.10,现在它连接并保持连接...