Использование каналов Django для уведомлений - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над проектом django, который позволяет двум пользователям общаться в чате.Как только вы получите новое сообщение, вы получите уведомление.Для выполнения обеих задач я использую каналы django и открываю веб-сокет.С моим приложением чата, работающим как положено, я перешел к работе над частью уведомлений.Однако здесь я сталкиваюсь с некоторыми проблемами.

У меня есть signal.py, где всякий раз, когда создается уведомление, я отправляю его в комнату для пользователя.

сигналов.py

@receiver(post_save, sender=Notification)
def newNotification(sender, instance, created, **kwargs):
    if created:

        channel_layer = get_channel_layer()
        room_name = "notif_room_for_user_"+str(instance.targetUser.id)

        async_to_sync( channel_layer.group_send)(
                   room_name, {"type": "user.gossip",
                   "event": instance.objectName,
                   "targetUser": instance.targetUser}
        )

consumer.py

class NoseyConsumer(AsyncJsonWebsocketConsumer):

async def connect(self):

    self.user = self.scope["user"]
    self.user_room_name = "notif_room_for_user_"+str(self.user.id) 

    await self.channel_layer.group_add(
            self.user_room_name,
            self.channel_name
        )
    await self.accept()


async def disconnect(self, close_code):
    await self.channel_layer.group_discard(
            self.user_room_name, 
            self.channel_name
            )


async def user_gossip(self, event):
    await self.send_json(event)

Когда я открываю веб-страницу, веб-розетка подключается нормально.Проблема в том, что когда я отправляю сообщение и создается новое уведомление, я получаю следующую ошибку

 "You cannot use AsyncToSync in the same thread as an async event loop - "
 You cannot use AsyncToSync in the same thread as an async event loop - just await the async function directly.

После этой ошибки я изменил newNotification в signal.py на async.Но тогда это никогда не вызывается.

...