Шаги действительно просты. Вы должны получить канальный слой и просто отправить сообщение с ключом type
, установленным в качестве имени метода прослушивания:
import channels
from asgiref.sync import async_to_sync
@receiver(post_save, sender=Scooter)
def scooter_post_update(sender, instance, created, **kwargs):
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.send)(
{"type": "send_message", "data": data}
)
и любым другим материалом, который вы хотите отправить по каналу.
Помните, что все передаваемые вами данные должны быть сериализуемыми, поэтому вам нужно заранее позаботиться о том, чтобы все ваши объекты были сериализованы.
Обязательная часть словаря, которую вы передаете в send
Метод - это ключ type
(как упоминалось ранее), который должен содержать имя метода, который будет вызываться у потребителя.
Кроме того, вы можете использовать группы, чтобы вы могли передавать сообщение группепрослушивателей:
import channels
from asgiref.sync import async_to_sync
@receiver(post_save, sender=Scooter)
def scooter_post_update(sender, instance, created, **kwargs):
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)(
"group_name", {"type": "send_message", "data": data}
)
и на стороне потребителя:
class ScootersUpdateConsumer(AsyncConsumer):
async def websocket_connect(self, event):
await self.channel_layer.group_add("group_name", self.channel_name)
await self.send({
"type": "websocket.accept"
})
Обратите внимание, что в обоих случаях используется оболочка async_to_sync
, которая должна использоваться при вызове асинхронного кода изобласть синхронизации.