繁体   English   中英

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,并且在连接后大约 2 秒内我遇到了 websocket 断开连接的问题。

这是我的消费者,它已连接,但几秒钟后,它会断开连接而不会触发断开连接

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 向控制台写入 websocket 已连接,几秒钟后写入断开连接,错误代码为 1011。

谁能告诉我它在这里失败了什么? 我想如果 websocket 连接,路由和所有东西都可以,但它在没有任何建议的情况下断开连接......

我应该安装 uvicorn 还是类似的? 我正在使用 WIndows、Eclipse、PyDev 进行开发...

发现问题了!

Windows 上的 Redis 版本未升级到版本 5。

我从这里安装了 Redis 版本 5.0.10,现在它连接并保持连接......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM