【问题标题】:Django Channels 2.0: call Consumer's channel by its nameDjango Channels 2.0:按名称调用消费者的频道
【发布时间】:2018-07-13 19:03:38
【问题描述】:

我正在尝试将我的代码从 django-channels 1.1.8 升级到 2.0.0

所以,我只想执行一个非常简单的异步后台任务,不知道如何像在 1.1.8 中那样通过其名称调用消费者

以下示例不起作用(不打印):

routing.py

from channels.routing import ProtocolTypeRouter, ChannelNameRouter

from tasks.consumers import LongTask

application = ProtocolTypeRouter({

    'channel': ChannelNameRouter({
        'long-task': LongTask
    }),

})

consumers.py

from channels.consumer import SyncConsumer

class LongTask(SyncConsumer):

    def long_task(self, message):
        print(message)

views.py

def perform_long_task(request):

    channel_layer.send('long-task', {
        'type': "long.task",
        'text': 'Hey!'
    })

我猜这里有问题channel_layer.send('long-task', {...})

非常感谢

【问题讨论】:

    标签: django django-views django-channels


    【解决方案1】:

    如果在runworker之后还是不行,见下文。

    手册说:

    还请记住,如果您从同步环境发送事件,则必须使用通道层中指定的 asgiref.sync.async_to_sync 包装器。

    所以你应该在你的视图中尝试这个:

    async_to_sync(channel_layer.send)("long-task", {"type": "long.task", "text": 'Hey!'})
    

    【讨论】:

      【解决方案2】:

      因此,根据您的实施,您走在了正确的轨道上。您忘记运行以下命令

      python manage.py runworker long-task

      打印消息将显示在那里。此处提供更多信息https://channels.readthedocs.io/en/latest/topics/worker.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多