所以我有一个预定的芹菜节拍任务(celery.py):
@app.on_after_configure.connect
def setup_periodic_tasks(sender,
**kwargs):
sender.add_periodic_task(10.0, test_event, name='test')
任务(events / tasks.py):
@shared_task
def test_event():
from .models import Event
Event.objects.create()
当创建事件时,会触发一个接收器,它应该向一个通道组(events / receivers.py)发送一条消息:
@receiver(post_save, sender=Event)
def event_post_add(sender, instance, created, *args, **kwargs):
if created:
print("receiver fired")
Group("test").send({
"text": json.dumps({
'type': 'test',
})
})
主要问题是接收器在芹菜节拍过程中被解雇,并且没有任何东西通过django频道发送。没有错误消息,没有,只是没有被发送。
如何整合这两个,以便我能够从芹菜背景流程向渠道发送消息?
答案 0 :(得分:1)
嗨,我不知道您是否找到了解决方案。但由于我自己被困在这个问题上,所以我尝试了一个解决方法。 我为需要通过 websocket 发送的消息创建了一个视图,并从 celery beat 向它发出请求 视图:
def send_message(request,uuid,name):
print('lamo')
ty = f"uuid_{uuid}"
data={
'message':f'{name} Driver is now Avaliable',
'sender':'HQ',
'id':str(uuid),
'to':str(uuid),
'type':'DriverAvailable',
}
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
ty,
{'type':'chat_message',
'message':data,
}
)
和任务:
def my_task():
list=[]
for d in Driver_api.objects.all():
if d.available_on !=None:
if d.available_on <= timezone.now():
d.available_on = None
d.save()
uuid = str(d.user.uuid)
requests.get(f'{DOMAIN}message/sendMessage/{uuid}/{d.name}')
logger.info('Adding {0}'.format(d.user.uuid))
return list
对于我解决问题的方法中的任何疏忽或疏忽,我们深表歉意。