Django:信号到底有什么用?

时间:2010-01-19 21:26:26

标签: django django-signals aop

我很难理解信号如何进入我的应用程序(以及它们如何工作期)。这是我认为适用的三个方面(用我目前的知识):

  1. 将XML发送到远程服务器进行报告(在事务完成后)。
  2. 重新调整图片大小,并在用户上传后将缩略图上传到S3。
  3. 用户从其帐户中删除图像对象后,从S3中删除旧图像。
  4. 我完全偏离基地(我觉得我可能会)。 我是否收到信号和多线程混合?如果是这样,他们在应用程序中进行比较吗?它们只是用于解耦吗?另外,确保你提前实例化它们并且不使用本地函数(因为它们会收集垃圾)是什么?有人可以详细说明吗?我是否应该将它们全部放入请求中间件中以便我不必担心?

4 个答案:

答案 0 :(得分:16)

Django信号是一种执行操作A以响应事件E的方法。

在虚幻的世界中,您可以通过修改发生事件E的代码来避免使用信号,并附加代码来执行操作A

问题在于这样做会导致可维护性,可读性和许多其他软件工程形容词的松散性:)

信号允许您独立地从事件E发生的位置或方式做同样的事情,并以巧妙的方式这样做,允许可维护性,可读性等......

是的,我认为说Signals对于启用解耦非常有用。

(你也提到了多线程。如果你这样做是因为你认为信号是好的,因为它们是同时执行的那么快......嗯......我不知道它们是否同时被执行但不管怎样我真的不喜欢我认为这是django信号有用的重点。

利用信号的好方法的一个例子是,当你想在django中向用户存储其他信息时,你必须使用Userprofiles。 在这种情况下,documentation itself告诉您注册信号以响应任何新用户的创建,只是为了向新创建的用户添加空用户配置文件。

答案 1 :(得分:4)

这是一个可能有帮助的例子。

假设您需要在保存模型实例时执行某些操作。但是,此操作与模型或模型实例本身无直接关系。因此,将您的操作代码放在模型的save()方法中是没有意义的。这会导致不必要的代码耦合和混乱。相反,您可以在应用程序中的其他位置(甚至在其他应用程序中)创建信号处理程序,使其更有意义。

答案 2 :(得分:1)

我会执行任务2和3(图像内容),例如异步任务队列,如Celery

这与多线程类似。

答案 3 :(得分:0)

信号不是异步的(不能以并行或并行方式运行)

这就是为什么它们如此有用的原因:

  • 文件上传或文件后处理
  • 报告生成
  • 其他任何长期操作(对其他服务器ET的请求)

最好Celery工作人员可以以真正的异步方式执行长期操作。

但是它们在某些有限的情况下仍然很有价值

  • 扩展了第三方库的功能。如果您使用的应用程序具有无法控制代码的模型,则信号是猴子修补程序更健壮的替代方案,可以对保存或删除执行特定操作。
  • 删除信号适用于删除查询集方法。如果您希望对单个对象和queryset删除执行相同的操作,那么信号可能是最好的选择。
    注意:由于生成SQL的方式,这不适用于更新queryset方法(带有保存信号)。另一个经常引起混乱/错误的来源。
  • 当您需要将相同的信号处理程序应用于多个模型时。如果您只有几个,我仍然倾向于覆盖save / delete方法并调用共享函数。不仅如此,到处复制/粘贴save方法变得更加容易出错,并且信号似乎是一个更好的选择。
  • 避免紧密的跨应用程序依赖性。如果您需要跨越应用程序边界,尤其是当该应用程序可以在多个项目中使用时,信号可能会更好地实现应用程序之间的松散耦合。不过要小心这一点。使用它是因为您需要这样做,而不是因为您认为将来可能会想要它。

这些案例和其中的一些示例,您可以找到in this topic