Вызов функции Channels AsyncWebCoscketConsumer из приемника сигналов не работает

Во-первых, вот код. Я проверил его сейчас не знаю сколько раз на наличие ошибок, и отлаживал шаг за шагом, чтобы выяснить, почему функция не вызывается.

# signals.py
@receiver(post_save, sender=Ticket)
def new_ticket(sender, instance, created, **kwargs):
    print("in receiver")
    if created:
        print("in created")
        channel_layer = get_channel_layer()
        print(channel_layer)
        async_to_sync(channel_layer.group_send(
        'tickets_updates_group',
        {
            'type': 'new_ticket',
            'subject': "from receiver"
        }))
        print("after async_to_sync")

Все операторы печати всегда вызываются.

# consumers.py
class Tickets(AsyncWebsocketConsumer):
    async def connect(self):
        await self.channel_layer.group_add('tickets_updates_group', self.channel_name)
        await self.accept()
    
    async def disconnect(self, close_code):
        await self.channel_layer.group_discard('tickets_updates_group', self.channel_name)
        await self.close()

    async def new_ticket(self, event):
        print('in consumer.new_ticket')
        subject = event['subject']
        print("subject: " + subject)
        await self.send(text_data=json.dumps({
            'subject': subject
        }))
        print("after send")

Здесь функция new_ticket никогда не вызывается, ни один из операторов печати не выполняется, и моя веб-страница не обновляется (в отличие от размещения кода group_send в функции connect класса-потребителя.

).

Я знаю, что проблема не в синтаксисе, потому что если я добавляю код приемника в функцию подключения потребителей, функция new_ticket всегда вызывается без проблем (после замены async_to_sync на await.

).

Я видел все возможные рабочие примеры и не могу понять, почему я не могу вызвать потребительскую функцию из приемника сигналов.

Любая помощь будет высоко оценена. Спасибо!

РЕШЕНИЕ: Исправление синтаксической ошибки! При вызове извне класса consumers я обернул вызов group_send в async_to_sync и допустил ошибку со скобками в первой строке:

async_to_sync(channel_layer.group_send(
    'tickets_updates_group',
    {
        'type': 'new_ticket',
        'subject': "from receiver"
    }))

Изменено на:

async_to_sync(channel_layer.group_send)(
    'tickets_updates_group',
    {
        'type': 'new_ticket',
        'subject': "from receiver"
    })

И все работает (я также перешел на канальный слой redis, так как до этого отлаживал).

Вернуться на верх