Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django通道2和信号:Websocket连接失败_Django_Signals_Django Channels - Fatal编程技术网

Django通道2和信号:Websocket连接失败

Django通道2和信号:Websocket连接失败,django,signals,django-channels,Django,Signals,Django Channels,我使用通道2和信号来检测某一类型的模型何时被保存,并将通知推送到所有客户端。我发现错误:到“ws:/account/home”的WebSocket连接失败:WebSocket在建立连接之前已关闭。我不知道我在哪里犯了错误。 非常感谢你的帮助 在我的项目中:FUNDBOOK_V5/ROUTING.PY from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLR

我使用通道2和信号来检测某一类型的模型何时被保存,并将通知推送到所有客户端。我发现错误:到“ws:/account/home”的WebSocket连接失败:WebSocket在建立连接之前已关闭。我不知道我在哪里犯了错误。 非常感谢你的帮助

在我的项目中:FUNDBOOK_V5/ROUTING.PY

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import FundBook_Core.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            FundBook_Core.routing.websocket_urlpatterns
        )
    ),
})
from django.urls import re_path
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^account/home/$', consumers.NotificationConsumer),
    url(r'^fund/(?P<fund>[\w-]+)/$', consumers.NotificationConsumer),
]
在我的应用程序中:FUNDBOOK\u CORE\ROUTING.PY

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import FundBook_Core.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            FundBook_Core.routing.websocket_urlpatterns
        )
    ),
})
from django.urls import re_path
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^account/home/$', consumers.NotificationConsumer),
    url(r'^fund/(?P<fund>[\w-]+)/$', consumers.NotificationConsumer),
]
SIGNALS.PY

from FundBook_Core.models import ThreadTask
from django.db.models.signals import pre_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer


@receiver(pre_save, sender=ThreadTask)
def notify_thread_task_save(sender, **kwargs):
    if "instance" in kwargs:
        instance = kwargs["instance"]
        # check if there is a new notification
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "task", {"type": "send_message",
                     "event": "New Notification",
                     "username": instance.username}
        )
FUNDBOOK_CORE\INIT.PY

default_app_config = "FundBook_Core.apps.FundbookCoreConfig"
FUNDBOOK_CORE\APPS.PY

from django.apps import AppConfig


class FundbookCoreConfig(AppConfig):
    name = 'FundBook_Core'

    def ready(self):
        from . import signals
设置.PY

ALLOWED_HOSTS = ['*']

ASGI_APPLICATION = 'FundBook_v5.routing.application'

# Channels
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [("localhost", 6379)]},
    }
}
HOME.HTML:

   <script>
        var loc = window.location;
        var wsStart = "ws://"
        if (loc.protocol === 'https:'){
            wsStart = 'wss://'
        }
        var url = wsStart + loc.host + loc.pathname;
        console.log(url)
        var socket = new ReconnectingWebSocket(url);

    socket.onmessage = function(e) {
        console.log("message", e)
        const data = JSON.parse(e.data);
        document.querySelector('#notifylist').value += (data.message + '\n');
    }
     socket.onopen = function(e) {
        console.log("open", e)
    }
     socket.onerror = function(e) {
        console.log("error", e)
         console.error('Notification socket closed unexpectedly')
    }
     socket.onclose = function(e) {
        console.log("close", e)
    }

    </script>

var loc=窗口位置;
var wsStart=“ws://”
如果(loc.protocol===“https:”){
wsStart='wss://'
}
var url=wsStart+loc.host+loc.pathname;
console.log(url)
var套接字=新的重新连接WebSocket(url);
socket.onmessage=函数(e){
控制台日志(“消息”,e)
const data=JSON.parse(e.data);
document.querySelector('#notifylist').value+=(data.message+'\n');
}
socket.onopen=函数(e){
控制台日志(“打开”,e)
}
socket.onerror=函数(e){
console.log(“错误”,e)
console.error('通知套接字意外关闭')
}
socket.onclose=函数(e){
控制台日志(“关闭”,e)
}

事实上,我有两个问题: 第一个:ERR_CONNECTION_RESET问题是在防火墙阻止websocket连接或未配置为处理websocket连接时引起的。 第二个错误:错误-服务器-应用程序内部异常:多个异常:[Errno 10061]连接调用失败('::1',6379),[Errno 10061]连接调用失败('127.0.0.1',6379)来自redit数据库:请参阅

在我解决了这些问题后,一切正常。对于需要代码的用户:

应用程序INIT

default_app_config = "your_application.apps.FundbookCoreConfig"
APP.APPS

from django.apps import AppConfig


class your_appConfig(AppConfig):
name = 'your_app'

    def ready(self):
        from . import signals
PROJECT.SETTINGS

ASGI_APPLICATION = 'your_project.routing.application'

# Channels
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [("localhost", 6379)]},
    }
}
APP.SIGNALS

from django.db.models.signals import pre_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync

from channels.layers import get_channel_layer
from.models import ThreadTask


@receiver(pre_save, sender=ThreadTask)
def notify_thread_task_save(sender, **kwargs):
    if "instance" in kwargs:
        instance = kwargs["instance"]
        # check if there is a new notification
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "task", {"type": "user_notification",
                     "event": "New Notification",
                     "notification": instance.text}
        )
项目.路由

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
import your_app.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                FundBook_Core.routing.websocket_urlpatterns
            )
        )
    ), 
})
APP.ROUTING

from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^account/home', consumers.NotificationConsumer),
    url(r'^fund/(?P<fund>[\w-]+)', consumers.NotificationConsumer),
]
在html中

<!-- Plugin JavaScript -->
<script src="{% static "FundBook_Core/js/reconnecting-websocket.js" %}"></script>

<script>
        var loc = window.location;
        var wsStart = "ws://"
        if (loc.protocol === 'https:'){
            wsStart = 'wss://'
        }
        var url = wsStart + loc.host + loc.pathname;
        console.log(url)
        var socket = new ReconnectingWebSocket(url);
        const tt = document.querySelector('#task_text');

        socket.onmessage = function(e) {
            console.log("message", e)
            const data = JSON.parse(e.data);
            console.log("parse", data)
            console.log("notification", data.notification)
            if(data.event == "New Notification"){
                 var el = document.createElement("li");
                 el.innerHTML = data.notification;
                 tt.appendChild(el);

            }


    }
     socket.onopen = function(e) {
        console.log("open", e)
    }
     socket.onerror = function(e) {
        console.log("error", e);
        console.error('Notification socket closed unexpectedly')
    }
     socket.onclose = function(e) {
        console.log("close", e)
    }

</script>

var loc=窗口位置;
var wsStart=“ws://”
如果(loc.protocol===“https:”){
wsStart='wss://'
}
var url=wsStart+loc.host+loc.pathname;
console.log(url)
var套接字=新的重新连接WebSocket(url);
const tt=document.querySelector(“#task_text”);
socket.onmessage=函数(e){
控制台日志(“消息”,e)
const data=JSON.parse(e.data);
日志(“解析”,数据)
console.log(“通知”,data.notification)
如果(data.event==“新通知”){
var el=document.createElement(“li”);
el.innerHTML=data.notification;
tt.儿童(el);
}
}
socket.onopen=函数(e){
控制台日志(“打开”,e)
}
socket.onerror=函数(e){
控制台日志(“错误”,e);
console.error('通知套接字意外关闭')
}
socket.onclose=函数(e){
控制台日志(“关闭”,e)
}

事实上,我有两个问题: 第一个:ERR_CONNECTION_RESET问题是在防火墙阻止websocket连接或未配置为处理websocket连接时引起的。 第二个错误:错误-服务器-应用程序内部异常:多个异常:[Errno 10061]连接调用失败('::1',6379),[Errno 10061]连接调用失败('127.0.0.1',6379)来自redit数据库:请参阅

在我解决了这些问题后,一切正常。对于需要代码的用户:

应用程序INIT

default_app_config = "your_application.apps.FundbookCoreConfig"
APP.APPS

from django.apps import AppConfig


class your_appConfig(AppConfig):
name = 'your_app'

    def ready(self):
        from . import signals
PROJECT.SETTINGS

ASGI_APPLICATION = 'your_project.routing.application'

# Channels
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [("localhost", 6379)]},
    }
}
APP.SIGNALS

from django.db.models.signals import pre_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync

from channels.layers import get_channel_layer
from.models import ThreadTask


@receiver(pre_save, sender=ThreadTask)
def notify_thread_task_save(sender, **kwargs):
    if "instance" in kwargs:
        instance = kwargs["instance"]
        # check if there is a new notification
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "task", {"type": "user_notification",
                     "event": "New Notification",
                     "notification": instance.text}
        )
项目.路由

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
import your_app.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                FundBook_Core.routing.websocket_urlpatterns
            )
        )
    ), 
})
APP.ROUTING

from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^account/home', consumers.NotificationConsumer),
    url(r'^fund/(?P<fund>[\w-]+)', consumers.NotificationConsumer),
]
在html中

<!-- Plugin JavaScript -->
<script src="{% static "FundBook_Core/js/reconnecting-websocket.js" %}"></script>

<script>
        var loc = window.location;
        var wsStart = "ws://"
        if (loc.protocol === 'https:'){
            wsStart = 'wss://'
        }
        var url = wsStart + loc.host + loc.pathname;
        console.log(url)
        var socket = new ReconnectingWebSocket(url);
        const tt = document.querySelector('#task_text');

        socket.onmessage = function(e) {
            console.log("message", e)
            const data = JSON.parse(e.data);
            console.log("parse", data)
            console.log("notification", data.notification)
            if(data.event == "New Notification"){
                 var el = document.createElement("li");
                 el.innerHTML = data.notification;
                 tt.appendChild(el);

            }


    }
     socket.onopen = function(e) {
        console.log("open", e)
    }
     socket.onerror = function(e) {
        console.log("error", e);
        console.error('Notification socket closed unexpectedly')
    }
     socket.onclose = function(e) {
        console.log("close", e)
    }

</script>

var loc=窗口位置;
var wsStart=“ws://”
如果(loc.protocol===“https:”){
wsStart='wss://'
}
var url=wsStart+loc.host+loc.pathname;
console.log(url)
var套接字=新的重新连接WebSocket(url);
const tt=document.querySelector(“#task_text”);
socket.onmessage=函数(e){
控制台日志(“消息”,e)
const data=JSON.parse(e.data);
日志(“解析”,数据)
console.log(“通知”,data.notification)
如果(data.event==“新通知”){
var el=document.createElement(“li”);
el.innerHTML=data.notification;
tt.儿童(el);
}
}
socket.onopen=函数(e){
控制台日志(“打开”,e)
}
socket.onerror=函数(e){
控制台日志(“错误”,e);
console.error('通知套接字意外关闭')
}
socket.onclose=函数(e){
控制台日志(“关闭”,e)
}