微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 3.1.5 和 Channels 3.0.3 websocket 问题

如何解决Django 3.1.5 和 Channels 3.0.3 websocket 问题

我正在将应用程序迁移到 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 版,现在它连接并保持连接...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。