Django Channels. Как избежать исключения RuntimeError: Task got Future attached to a different loop?
Я использую Django Channels
с channel_layers
(RedisChannelLayer
).
Используя каналы, мне нужно получать живые сообщения от сигналов только тогда, когда происходит событие post_save.
Я пытаюсь отправить сообщение из модуля signals.py
.
Дело в том, что сообщение отправляется правильно, я успешно получил его в консоли,
но затем происходит отсоединение от сокета с исключением:
RuntimeError: Task got Future attached to a different loop.
Это относится к ...redis/asyncio/connection.py:831
.
Все мои настройки были выполнены правильно в соответствии с документацией.
.
Мой проект также использует DRF
, Celery
(на Redis), Redis
сам, Daphne
сервер.
Я пытаюсь реализовать его только в режиме Debug=True, не говоря уже о production.
.
Я понятия не имею, что происходит и как это решить.
Вот фрагменты из моего кода:
#consumers.py
class LikeConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_group_name = "likes"
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def chat_message(self, event):
message = event['message']
await self.send(text_data=json.dumps({
'type': 'chat',
'message': message
}))
#signals.py
channel_layer = get_channel_layer()
@receiver(post_save, sender=Like)
def new_like(sender, instance, **kwargs):
async_to_sync(channel_layer.group_send)(
'likes',
{
"type": "chat_message",
"message": "1212341324, 213413252345"
}
)
//script.js
const likeSocket = new WebSocket(url);
likeSocket.onmessage = function(e) {
let data = JSON.parse(e.data);
console.log(data);
};
После нескольких дней изучения проблемы я понял, что исключение, RuntimeError, в этом случае является просто Warning, а не Error.
Потому что server doesn't break and the Socket is going on
далее.
И это "Предупреждение" все еще находится в стадии Bug в каналах разработчиков.
В консоли сервера это выглядит не красиво, но работает правильно.
Я пытался попробовать исключить его, но не могу разобраться - не понимаю, какой код вызывает Ошибку для попытки исключения.