【问题标题】:sending message to client using Django Channels from Celery tasks.py使用 Celery tasks.py 中的 Django Channels 向客户端发送消息
【发布时间】:2019-08-06 20:07:30
【问题描述】:

我正在尝试在 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 终端中的结果 click to see celery terminal

提前致谢

【问题讨论】:

  • 嗨,我也面临同样的错误。你是如何摆脱这个错误的??
  • 嗨,就像 Aaron 下面说的,我使用“group_send”方法而不是“send”。 async_to_sync ( channel_layer.group_send ) ( "chat", { "type" : "hello.message" , "message" : "我的自定义消息" })

标签: python django websocket celery django-channels


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2019-08-15
    • 2023-03-16
    • 2017-01-12
    • 1970-01-01
    • 2018-07-29
    • 2023-04-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多