Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Websocket 从消费者外部收听django频道_Websocket_Redis_Listener_Django Channels - Fatal编程技术网

Websocket 从消费者外部收听django频道

Websocket 从消费者外部收听django频道,websocket,redis,listener,django-channels,Websocket,Redis,Listener,Django Channels,文档解释说,可以从消费者外部发布到渠道层: 我需要做相反的事情。我有一个相当复杂的python脚本,它从pubnub读取实时数据,对其进行处理,并通过channel_层上的组将其推送到消费者手中。这很好,但我需要消费者能够向这个脚本宣布他们的存在,以便它可以向他们推送数据(目前只有当它从pubnub获得新数据时,它才会推送到通道层,可能是每24小时一次) 我决定通过让消费者在connect上发布到“状态”频道来解决这个问题。我现在需要pubnub源脚本来收听这个频道。 我已经尝试将下面的内容添加

文档解释说,可以从消费者外部发布到渠道层: 我需要做相反的事情。我有一个相当复杂的python脚本,它从pubnub读取实时数据,对其进行处理,并通过channel_层上的组将其推送到消费者手中。这很好,但我需要消费者能够向这个脚本宣布他们的存在,以便它可以向他们推送数据(目前只有当它从pubnub获得新数据时,它才会推送到通道层,可能是每24小时一次)

我决定通过让消费者在connect上发布到“状态”频道来解决这个问题。我现在需要pubnub源脚本来收听这个频道。 我已经尝试将下面的内容添加到脚本中,它不再抛出错误,但实际上不会响应消息。它成功地加入了通道层,但消息处理程序
(receive_json)
从未启动

from channels.generic.websocket import JsonWebsocketConsumer


class channelConsumer(JsonWebsocketConsumer):

    def __init__(self):
        self.channel_name = 'source'
    def join(self):
        async_to_sync(channel_layer.group_add)('presence', self.channel_name)
    def receive_json(self, message):
        print("Presence Detected")
        # do some stuff
此外,在守则内:

global channel_layer
channel_layer = get_channel_layer()

global listener
listener = channelConsumer()
listener.join()

正如我所说,没有显式错误,它似乎永远不会触发receive_json。肯定有数据包被发布到“状态”,因此问题肯定在下面的代码中。

对于要接收消息的消费者,该消费者需要插入路由器。最常见的情况是使用URLRouter,消费者将从连接(例如web套接字)接收事件

您可以使用ChannelNameRouter创建一个消费者,该消费者将收听特定的香奈儿频道。例如,消费者可能是:

from channels.consumer import SyncConsumer
class ChannelConsumer(SyncConsumer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def post_save(self, event):
        print("POSTSAVE", event)
然后在你的路由器上

from channels.routing import ProtocolTypeRouter, URLRouter,ChannelNameRouter
application = ProtocolTypeRouter({
    "websocket": TokenAuthMiddlewareStack(
        URLRouter([
            url(r"^.*$", RestConsumer),
        ]),
    ),
    "channel":ChannelNameRouter({
        "signals": ChannelConsumer,
    })

})
现在,您可以向该消费者发送消息

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
async_to_sync(channel_layer.send)("signals", {"type": "post.save", "message":"Hello Consumer"})
特别是对于您的情况,如果希望多个频道接收消息,您还需要将“信号”频道添加到要使用的组中

请注意,如果使用ChannelNameRouter,则需要启动将处理它的工作进程

./manage.py runworker signals

这听起来像是一个PubNub问题,但没有包含PubNub代码。同时,我用
pubnub
标记了它,但如果您确定此处不需要pubnub insight,则可以删除它。@CraigConover如果您不介意,我将删除它。PubNub是数据的原始源,但这里的问题是通过通道层发送数据。原始来源可以是任何东西。可以理解。听起来好像需要一个额外的PubNub实现。干杯