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"},
)