Python Django:在数据库save()上从服务器向客户端发送消息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Django:在数据库save()上从服务器向客户端发送消息相关的知识,希望对你有一定的参考价值。
我想在保存模型时通知客户端。我首先在post_save上创建了一个django信号。
@receiver(post_save, sender=Scooter)
async def scooter_post_update(sender, instance, created, **kwargs):
# Notify client here
接下来,我从django-channels创建了AsyncConsumer类,并提供了其路由。
// routing.py
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
'websocket': AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter(
[
path('scooters/', ScootersUpdateConsumer)
]
)
)
)
})
// consumers.py
class ScootersUpdateConsumer(AsyncConsumer):
async def websocket_connect(self, event):
print("Connected!", event)
await self.send({
"type": "websocket.accept"
})
async def send_message(self):
await self.send({
"type": "websocket.send",
'text': 'Oy, mate!'
})
async def websocket_receive(self, event):
print("Receive!", event)
async def websocket_disconnect(self, event):
print("Disconnected!", event)
现在我的问题是如何从scooter_post_update()方法调用send_message()。
答案
这些步骤非常简单。您必须获取通道层,然后只发送带有设置为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
包装器,当您从同步作用域调用异步代码时应使用该包装器。
以上是关于Python Django:在数据库save()上从服务器向客户端发送消息的主要内容,如果未能解决你的问题,请参考以下文章
python,django,向mysql更新数据时save()报错不能用