отправка сообщения клиенту с использованием каналов Django из Celery tasks.py - PullRequest
3 голосов
/ 15 марта 2019

Я пытаюсь использовать каналы (v2.1.7) в django для отправки сообщений с сервера на клиент. Когда я выполняю приведенную ниже задачу celery, мое сообщение не извлекается в consumer.py (поэтому не отправляется клиенту) и, к удивлению, ошибки не происходит.

Я могу отправить сообщение от клиента клиенту напрямую. Но мне не удалось отправить из-за пределов потребителей с помощью async_to_sync ().

(я пытался использовать метод async_to_sync в стандартном django views.py, и у меня была такая же проблема)

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']))

результат, который я имею в терминале сельдерея нажмите, чтобы увидеть терминал сельдерея

Заранее спасибо

1 Ответ

0 голосов
/ 19 марта 2019

Похоже, вы используете метод channel_layer.send, но я думаю, что вы на самом деле хотите использовать вместо него channel_layer.group_send.

...