model.save() 上的 django-channels 数据绑定

django-channels databinding on model.save()

我有一个使用数据绑定的频道应用程序。当使用 django admin 进行更改时,它们将按预期推送到网络。我在套接字连接上设置了循环,以便在 gpio 单元上进行一些长轮询并更新数据库,这些更改不会被推送到网络上。频道文档说:

信号用于为出站绑定提供动力,因此如果您在 Django 之外更改模型的值(或使用 QuerySet 上的 .update() 方法),则不会触发信号,也不会执行更改送出。您可以自己触发更改,但您需要从系统的正确位置获取事件。

我该如何触发这些更改,就像管理员发生的那样?

谢谢,如果这含糊不清,请告诉我。

相关底层代码在channels/binding/base.pylines 121-187中(至少在1.1.6版本中)。这是接收和处理信号的地方。它涉及一些不同的事情,例如跟踪将消息发送到哪些组。所以它有点复杂,但您可能可以梳理出如何去做,看看那个代码。

涉及的步骤基本是:

  • 为客户找到合适的群体
  • 按照与数据绑定代码相同的方式格式化您的消息(参见 this section of the docs
  • 将消息发送到您在第 1 步中找到的所有相关组。

或者,您可以考虑使用 REST API,这样套接字代码将 POST 提交给 API(这将通过 ORM 在正常情况下创建数据库记录方式)而不是直接创建数据库记录。在这种情况下,您的信号将自动发生。 djangorestframework (服务器端)和 requests (客户端,如果你使用 python 作为长轮询代码)是你的朋友,如果你想那样做的话,因为当然。如果您为长轮询客户端使用另一种语言,则有许多用于 REST API 客户端工作的等效包。

祝你好运!