【发布时间】:2019-12-26 23:00:18
【问题描述】:
我有一个 Django 应用程序,它使用通道来监视 WebSocket 以启动 Celery 中的后端任务。它当前休眠给定的数量,然后返回 true。
问题是我不知道如何从 celery 任务中访问 WebSocket,因此我可以在完成后通知 UI。
celery==4.3.0
channels==2.2.0
Django==2.2.4
django-celery-results==1.1.2
djangorestframework==3.10.2
我的任务.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
import time
@shared_task
def gotosleep(timeInSecs):
time.sleep(timeInSecs)
return True
我的消费者.py
from channels.generic.websocket import WebsocketConsumer
import json
from access.tasks import gotosleep
class AccessConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
pass
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
if message.isnumeric() == True:
print("------------------------------------------------------")
print(message)
gotosleep.delay(int(message))
self.send(text_data=json.dumps({
'message': 'We are dealing with your request'
}))
else:
self.send(text_data=json.dumps({
'message': 'Give me a number'
}))
有什么想法吗?非常感谢
【问题讨论】:
-
在 stackoverflow 上基本上有很多关于如何通过来自消费者外部的渠道发送消息的问题,例如 stackoverflow.com/questions/53461830/…。它也在文档中channels.readthedocs.io/en/latest/topics/…
-
@Ken4scholars:您完全正确,感谢您的链接。但我理解moonraker 因为频道文档有点误导。当他们第一次提到通道层是可选的,如果有人决定暂时离开它们,就会错过文档中所需的章节。
标签: django celery django-celery django-channels