Вызов функции 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, так как до этого отлаживал).