将django的信令体系结构与通道一起使用似乎是一种显而易见的组合:更改模型,触发信号,并通知消费者(通过信号处理程序和通道层),例如,通过一个WebSocket。
但是,在交易过程中,经常会更新模型,并且在交易过程中会发送django的pre_save
和post_save
信号,这意味着您通知客户的更改可能永远不会发生的一切。更烦人的是,当您跨通道层发送信息时,您正在从另一个线程查看数据库,并且由于事务未完成,因此您无法获取新数据。
django.db.transaction.on_commit
提供了一种安排事务完成后运行的信号处理程序(的一部分)的方法,提供了一种解决方法,但是这似乎是一个显而易见的问题,因为我完全没有文档或stackoverflow的问题,我有点不安(当然可以找到所提到的三个主题中的每一个的讨论!)那么,这种架构是:信号->处理程序->通道层->消费者[->客户端]实际上是一个坏问题吗?是否有其他选择不涉及将每个处理程序包装在on_commit
钩中,还是有一些常见的习惯用法来实现这种DRY方式?