Джанго 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)],
},
},
}
Поскольку исключений / ошибок нет, я совершенно не понимаю, какая часть этого процесса завершается с ошибкой.
- Сельдерей запускает задачу? Да
- Задача запускается и отправляет сообщение на канальный слой? Да
- Потребитель получает сообщение от группы и выполняет
send()
? Да
- Клиент получает сообщение websocket? NO
Это проблема между каналами и Redis? Это проблема между каналами и клиентом?