2010-01-19 71 views
7

我很难理解信号如何进入我的应用程序(以及它们如何工作)。这些是我以为他们会申请(我目前的知识)三个领域:Django:信号有什么好处?

  1. 发送XML到远程服务器报告(后交易完成)。
  2. 重新调整图像大小并在用户上传缩略图后上传到S3。
  3. 用户从其帐户中删除图像对象后,从S3中删除旧图像。

我完全脱离基地(我觉得我可能会)。 我得到的信号和多线程混合起来?如果是这样,他们在那里比较应用程序?他们只是为了解耦?另外,如何确保您尽早实例化它们并且不使用本地函数(因为它们会收集垃圾)?有人可以详细说明吗?我是否应该将它们都放在请求中间件的位置,以便我不必担心?

+0

我不明白你对多线程的参考。重点是什么? – 2010-01-19 21:37:11

+0

@Andrea Zilio查看对答案的评论1 – orokusaki 2010-01-20 19:14:06

回答

15

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

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

的问题是,这样做,你松可维护性,可读性和许多其他软件工程形容词:)

信号允许你从哪里以及如何事件发生E做同样的事情indipendently等这样的以一种聪明的方式,让maintanability,可读性等...

是的,我认为这说的信号是有用的,使decoupling是真的。如果你这样做是因为你认为信号是好的,因为它们同时执行,所以很快......呃......我不知道它们是否同时执行,但无论如何我真的不要认为这是什么django信号是有用的点)

利用信号的好方法的一个例子是关于这样一个事实,即当你想在django中存储其他信息给用户时,你有使用Userprofiles。 在这种情况下,documentation itself告诉您,为了响应任何新用户的创建而注册信号可能会很方便,只需向新创建的用户添加空用户配置文件即可。

+7

Django信号肯定是同步发送的。 – 2010-01-19 21:44:55

+0

@Ignacio我的意图不是说信号是同时执行的,而是试图想象为什么在这个问题中提到了多线程......我不知道它们是如何处理的。现在我知道了。感谢Ignacio;) – 2010-01-19 21:51:01

+0

你认为我列表中的3个任务是通过信号执行的好候选者吗? – orokusaki 2010-01-19 21:51:25

3

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

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

1

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

这类似于多线程。