当我想在某个事件发生时才运行方法时,我开始学习django信号功能。
所以我读到了自定义信号,我找不到在常规函数调用中使用信号的理由。
我在django Guide中读到了如何调用信号:
信号
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
电话:
def send_pizza(self, toppings, size):
pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
我无法理解它们是如何不同的。然后我直接打电话给 接收器功能...
有人可以启发我吗?
答案 0 :(得分:2)
您可以将信号视为observer design pattern的实现。
它建议删除从observable到observer的依赖项。所以观察者对观察者一无所知。
喜欢保存模型(post_save
和pre_save
信号)。您可能遇到需要YourModel.save方法的情况,不知道在保存之后/之前应该完成任务。
Django default signals是一个很好的样本。但我不认为你需要每天创建自定义信号(也不是每个项目!)。
我建议你不要使用信号(默认信号和自定义信号),直到你真正需要它们,让它们成为最后的选择。因为它们可以使您的代码难以阅读,因为读者无法轻易弄清楚您的逻辑在哪里。
1.7之前的Django没有关于放置信号接收器的约定。在django> = 1.7中,您应该使用AppConfig。准备连接接收器。
答案 1 :(得分:1)
Django信号是publish-subscribe design pattern的实现。它们允许您解耦项目的不同部分。例如,当您开发“制作披萨”应用程序时,您不必了解“交付披萨”应用程序。
此模式的另一个很好的例子 - django内置These 2 lines are the problem
[error] error while loading , error in opening zip file
[error] object scala.runtime in compiler mirror not found.
/ PS: if you wanna find what packages are broken do follow cli
find ~/.ivy2 ~/.m2 ~/.sbt -name "*.jar" -exec unzip -qqt {} \;
信号。您可以随时向此事件添加任何逻辑,而无需修改django核心。
广泛使用的场景是在创建用户实例后添加用户配置文件信息。您只需将监听器添加到maxPoolSize
事件。