我正在尝试将我的代码从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
答案 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!'})