通过芹菜向django-channels发送消息

时间:2017-01-24 11:48:56

标签: python django celery celerybeat django-channels

所以我有一个预定的芹菜节拍任务(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频道发送。没有错误消息,没有,只是没有被发送。

如何整合这两个,以便我能够从芹菜背景流程向渠道发送消息?

1 个答案:

答案 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

对于我解决问题的方法中的任何疏忽或疏忽,我们深表歉意。