Django и каналы, передача данных модели через вебсокеты после сохранения

Я новичок в websocket и channel с django. В моем проекте django я хочу передать сохраненные данные после события post_save в определенной модели через websocket. У меня django 3.2 и я установил:

channels==3.0.4
channels-redis==3.3.1

Затем в моем settings.py я добавляю channels в список приложений и устанавливаю:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'asgi_redis.RedisChannelLayer',
        'CONFIG': {
            'hosts': ["redis://:myredishost:6379/0"],
        },
        'ROUTING': 'backend.routing.channel_routing',
    }
}

перевести мое приложение с WSGI на ASGI:

ASGI_APPLICATION = "backend.asgi.application"

Затем я пытаюсь создать файл routing.py следующим образом:

from channels.routing import route
from alarms.consumers import ws_connect, ws_disconnect


channel_routing = [
    route('websocket.connect', ws_connect),
    route('websocket.disconnect', ws_disconnect),
]

и методы подключения и отключения (пока вставляем каждого подключенного пользователя ubto User group):

from channels import Group


def ws_connect(message):
    Group('users').add(message.reply_channel)


def ws_disconnect(message):
    Group('users').discard(message.reply_channel)

теперь у меня есть модель Results_Alarms:

# Model of Alarms data
class Results_Alarm(models.Model):
    id = models.AutoField(primary_key=True)
    var_id = models.ForeignKey('modbus.ModbusVariable', null=True, on_delete=models.SET_NULL)
    calc_id = models.ForeignKey(CalcGroup, null=True, on_delete=models.SET_NULL)
    templ_id = models.ForeignKey(AlarmsTemplate, null=True, on_delete=models.SET_NULL)
    a_trigger = models.CharField(max_length=200, verbose_name="Alarm trigger")
    dtopen = models.DateTimeField(verbose_name="Date of error")
    e_status = models.ForeignKey(AlarmStatus, null=True, on_delete=models.SET_NULL)
    dtclose = models.DateTimeField(verbose_name="Date of resolution", null=True, blank=True)
    u_involved = models.ForeignKey('accounts.CustomUser', related_name='oumanager', on_delete=models.CASCADE, null=True)
    
    ...

Я также создаю signals.py файл для управления событием post_save:

@receiver(post_save, sender=Results_Alarm)
def ws_alarms_data(sender, instance, created, **kwargs):
    #?? What here for send via websocket?

Теперь у меня проблема: Как я могу вызвать событие post_save и отправить через websocket последние сохраненные данные (возможно в формате json)? Я должен создать маршрутизатор? Но как?

Простите, но я ищу в Интернете и не нахожу ответа, который я могу понять.

Заранее большое спасибо

Не знаю, нашли ли вы ответ на свой вопрос. Если я правильно понял, вы хотите отправить сообщение в канал из сигналов. В этом случае вы можете использовать функцию get_channel_layer в doc

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

await channel_layer.group_send(
    "mychannel",
    {"type": "chat.message", "text": "42"},
)
Вернуться на верх