【问题标题】:Channels - how do I send data through websocket when signal is received?通道 - 收到信号时如何通过 websocket 发送数据?
【发布时间】:2020-09-28 16:41:08
【问题描述】:

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

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

我要在save_post 和我的consumers.py 中放入什么以便数据通过?

【问题讨论】:

    标签: python django django-channels django-signals


    【解决方案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)],
            },
        },
    }
    

    并将在您的Consumer 类中为拥有&lt;group_name&gt; 组的所有用户调用一个名为notify(函数名称由您选择)的函数

    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

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 2018-05-14
      • 2011-06-04
      • 2014-02-04
      • 2011-06-18
      相关资源
      最近更新 更多