Отправка сообщения из задачи «Сельдерей» на каналы - PullRequest
1 голос
/ 25 марта 2019

Джанго 2.1.1, Каналы Джанго 2.1.3, Сельдерей 4.2.1

Я настроил задачу в Celery, и в конце задачи мне нужно отправить сообщение веб-сокета клиенту (-ам). Тем не менее, сообщение websocket никогда не отправляется. Не выдается никаких ошибок, просто не отправляется.

Я установил слой канала, используя Redis в качестве бэкэнда. Делать это из обычного представления Django работает нормально. Но когда он запускается в задаче Celery, он отправляет сообщение в Channels, и я вижу, что Channels действительно выполняет код, показанный в моем коде consumer.py ниже, но клиент никогда не получает сообщение websocket.

tasks.py

def import_job(self):
    # (do task calculations, store in data dict)
    message = {'type': 'send_my_data',
               'data': json.dumps(thecalcs) }
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)('core-data', message)

consumers.py

class AsyncDataConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.channel_group_name = 'core-data'

        # Join the group
        await self.channel_layer.group_add(
            self.channel_group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        # Leave the group
        await self.channel_layer.group_discard(
            self.channel_group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    async def receive(self, text_data=None, bytes_data=None):
        pass

    # Receive message from the group
    async def send_my_data(self, event):
        text = event['data']
        # Send message to WebSocket
        await self.send(text_data=text)

settings.py

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

Поскольку исключений / ошибок нет, я совершенно не понимаю, какая часть этого процесса завершается с ошибкой.

  1. Сельдерей запускает задачу? Да
  2. Задача запускается и отправляет сообщение на канальный слой? Да
  3. Потребитель получает сообщение от группы и выполняет send()? Да
  4. Клиент получает сообщение websocket? NO

Это проблема между каналами и Redis? Это проблема между каналами и клиентом?

1 Ответ

2 голосов
/ 26 марта 2019

Оказывается, Celery проглотил исключение в моем коде во время выполнения задания. Мне нужно реализовать более тщательную регистрацию, чтобы перехватить эти исключения.

...