频道-收到信号后如何通过websocket发送数据?

时间:2020-06-09 13:23:52

标签: python django django-channels django-signals

我想通过websocket从数据库流式传输数据。基本上,每秒都会有一条新记录插入到DataModel中,我想在插入后立即通过websocket发送此新记录。有人建议我在调用模型的save()方法时使用信号。所以我刚添加了这个:

def save_post(sender, instance, **kwargs):
    print('signal')
post_save.connect(save_post, sender=DataModel)

我应该在save_post里面以及在我的consumers.py里面放些什么,以便数据可以通过?

1 个答案:

答案 0 :(得分:1)

您首先必须使用以下代码连接到Django频道层:

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
channel_layer = get_channel_layer()
data = <your-data> # data you want to send
async_to_sync(channel_layer.group_send(<group_name>, {
    "type": "notify",
    "message": data
}))

它将把您连接到您在设置文件中定义的默认后端层:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
    },
}

,并将在notify类中为所有具有Consumer组的用户调用名为<group_name>的函数(函数名称由您选择)

async def notify(self, event):
    data = event["message"]
    # here you can do whatever you want to do with data

有关更多信息,请参见此处的工作示例:https://channels.readthedocs.io/en/latest/tutorial/part_2.html#enable-a-channel-layer