信号

现在,细节。

Django 信号是一种在应用程序发生时通知你的应用程序某些任务(例如模型预存或后保存或删除)的方法。

这些信号允许你在信号释放后立即执行你选择的操作。

例如,无论何时创建新的 Django 用户,用户模型都会释放一个信号,并关联诸如 sender=User 之类的参数,使你可以专门针对你所发生的特定活动(在这种情况下是新用户创建)监听信号。

在上面的示例中,目的是在创建 User 对象之后立即创建 UserProfile 对象。因此,通过专门收听来自 User 模型(默认的 Django 用户模型)的 post_save 信号,我们在创建新的 User 之后创建了一个 UserProfile 对象。

Django 文档提供了有关所有可用信号的大量文档。

但是,上面的例子是用实际的术语解释使用信号时的典型用例可能是一个有用的补充。

拥有权利的同时也被赋予了重大的责任。将信号分散在整个应用程序或项目中可能很诱人,因为它们非常棒。好吧,不要。因为它们很酷并不能使它们成为解决每一个简单情况的首选解决方案。

像往常一样,信号非常适合一切。登录/退出,信号很棒。发布标志的关键模型,如用户模型,如果罚款。

为应用程序中的每个模型创建信号可能会在某个时刻变得势不可挡,并且打败了使用 Django 信号的整个想法。

不要使用信号 (基于 Django 的两个 Scoops 书 ):

  • 该信号与一个特定模型有关,可以移动到该模型的一种方法中,可能由 save() 调用。
  • 可以使用自定义模型管理器方法替换信号。
  • 该信号与特定视图相关,可以移动到该视图中

在以下情况下使用信号可能没问题:

  • 你的信号接收器需要对多个型号进行更改。
  • 你希望从多个应用程序发送相同的信号,并通过公共接收器以相同的方式处理它们。
  • 你希望在模型保存后使缓存无效。
  • 你有一个不寻常的场景需要回调,除了使用信号之外别无他法。例如,你想要根据第三方应用程序模型的 save()init() 触发某些内容。你无法修改第三方代码并且可能无法扩展它,因此信号会为回调提供触发器。