首页 > 解决方案 > 使用 Celery tasks.py 中的 Django 通道向客户端发送消息

问题描述

我正在尝试在 django 中使用通道(v2.1.7)将消息从服​​务器发送到客户端。当我执行下面的 celery 任务时,我的消息没有在 consumer.py 中获取(因此没有发送到客户端)并且令人惊讶的是没有发生错误。

我可以直接将消息从消费者发送到客户端。但我无法使用 async_to_sync() 从消费者外部发送。

(我尝试在标准 django views.py 中使用 async_to_sync 方法,但我遇到了同样的问题)

wololo/tasks.py

@app.task(name='wololo.tasks.upgrade_building')
def upgrade_building(user_id):


    os.environ['DJANGO_SETTINGS_MODULE'] = 'DjangoFirebaseProject.settings'

    from channels.layers import get_channel_layer
    channel_layer = get_channel_layer()
    print(channel_layer, "wololo")

    async_to_sync(channel_layer.send)('chat', {
        'type': 'hello.message',
        'message': 'hadiInsss',
    })

    return True

wololo/consumers.py

from channels.generic.websocket import WebsocketConsumer
import json
from asgiref.sync import async_to_sync

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        async_to_sync(self.channel_layer.group_add)("chat", self.channel_name)
        self.accept()

    def disconnect(self, close_code):
        async_to_sync(self.channel_layer.group_discard)("chat", self.channel_name)

    def hello_message(self, event):
        print("U MUST SEE THAT MSG")
        # Send a message down to the client
        self.send(text_data=json.dumps(event['message']))

我在 celery 终端中的结果 点击查看 celery 终端

提前致谢

标签: pythondjangowebsocketcelerydjango-channels

解决方案


看起来您正在使用 channel_layer.send 方法,但我认为您实际上想使用 channel_layer.group_send 。


推荐阅读