Django Channels 2.0:通过名称

时间:2018-02-03 11:37:11

标签: django django-views django-channels

我正在尝试将我的代码从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', {...})

Big thx

2 个答案:

答案 0 :(得分:0)

因此,根据您的实施情况,您走在正确的轨道上。你忘了运行以下

python manage.py runworker long-task

打印信息会显示在那里。更多信息请参见https://channels.readthedocs.io/en/latest/topics/worker.html

答案 1 :(得分:0)

如果在runworker之后仍然无法使用,请参见下文。

手册说:

  

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

因此,您应该在自己的视图中尝试以下方法:

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