Асинхронное ожидание в каналах Django не может получить объект с идентификатором - PullRequest
0 голосов
/ 28 ноября 2018

Мои потребители.py:

    async def user_taskcompleted(self, event):
     me = User.objects.get(username=event['username'])

     print("ME",me)
     mentor=me.mentor
     print("MY MENTOR", mentor)
     id_task =event['task']
     print("GETTING ID",id_task)
     notification = event['username'] + ' Completed new Task ' + 
     event['title']
     print("notification", notification)

     task = await Task.objects.get(id=id_task)


     obj =  
     await self.create_notification_to_trainer(me,notification,task)
     obj.receiver.add(mentor)
     await self.send_json(event)
     print("Got message {} at {}".format(event, self.channel_name))


  @database_sync_to_async
  def create_notification_to_trainer(self, sender,notification,task):

    return Notification.objects.create(sender=sender 
    ,notification=notification,task=task)

Мои сигналы.py:

@receiver(post_save, sender=Task)
def create_task_notification(sender, instance, created, **kwargs):
if  Task.objects.filter
(student=instance.student,student__mentor__isnull=False).exists():
if created:
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        "gossip", {"type": "user.taskcompleted",
                   "event": "New Task",
                   "task": instance.id,
                   "username": instance.student.username,

                   "title": instance.title,
                   "mentor": instance.student.mentor.username

                   })

          print("TASK  ID",instance.id)
  else:
      print("NO TRAINER")

Я пытаюсь сохранить данные в модели в моем consumer.py, чтобы сохранить уведомление оСохранение задачи. Проблема в том, что я не могу получить задачу, используя идентификатор задачи в моем consumer.py.Он показывает, что в моем терминале отсутствует запрос на сопоставление задачи.

Операторы печати для всех остальных полейотображается в моем терминале, и я также могу получить верный идентификатор задачи

Как показано в моем терминале:

    TASK  ID 323
    ME mohitharshan123 
    MY MENTOR rohitharshan
    GETTING ID 323
    notification mohitharshan123 Completed new Task safasfa 

Ошибка отображается в Task.objects.get (id = id_task)

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Использование asyncio.sleep решило проблему

import asyncio
from channels.db import database_sync_to_async

async def hub_notify(self, event):
   asyncio.sleep(1)
   me = await database_sync_to_async(HubNotify.objects.get) 
   (username=event['username'])
0 голосов
/ 29 ноября 2018

Если вы работаете в методе async, вам нужно обернуть ваши вызовы БД ORM в await database_sync_to_async

from channels.db import database_sync_to_async

async def user_taskcompleted(self, event):
     me = await database_sync_to_async(User.objects.get)(username=event['username'])
     ...

, см. Полную документацию по этому здесь

PS Если вы заинтересованы в наблюдении за экземплярами модели, взгляните на Django Channels Rest Framework [Disclamer Я автор основного участника]

...