django自定义信号与常规功能

时间:2015-05-04 13:00:59

标签: python django django-signals

当我想在某个事件发生时才运行方法时,我开始学习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)

我无法理解它们是如何不同的。然后我直接打电话给 接收器功能...

有人可以启发我吗?

2 个答案:

答案 0 :(得分:2)

您可以将信号视为observer design pattern的实现。

它建议删除从observable到observer的依赖项。所以观察者对观察者一无所知。

喜欢保存模型(post_savepre_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事件。