Django 2.1.1, 姜戈频道 2.1.3, 芹菜 4.2.1
我已经在 Celery 中设置了一个任务,在任务结束时,我需要向客户端发送 websocket 消息。但是,永远不会发送 websocket 消息。没有抛出错误,它只是不发送。
我已经使用 Redis 作为后端设置了一个通道层。从正常的 Django 视图执行此操作可以正常工作。但是当在 Celery 任务中运行时,它会将消息发送到通道,我可以看到通道确实运行了下面 consumers.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 消息?不
这是频道和 Redis 之间的问题吗?这是频道和客户端之间的问题吗?
事实证明,Celery 在任务期间吞下了我的代码中的一个异常。我需要实现更彻底的日志记录来捕获这些异常。