Django:信号到底有什么用?

Django:信号到底有什么用?,django,django-signals,aop,Django,Django Signals,Aop,我很难理解信号是如何在我的应用程序中工作的(以及它们是如何工作的)。根据我目前的知识,我认为这三个方面适用: 将XML发送到远程服务器进行报告(在事务完成后) 在用户上传图像后,重新调整图像大小并将缩略图上传到S3 用户从其帐户中删除图像对象后,从S3中删除旧图像 我是否完全偏离了基准(我觉得我可能是)我是否收到信号和多线程混淆?如果是,它们在应用程序中是否进行比较?它们只是为了脱钩吗?另外,要确保尽早实例化它们,并且不使用本地函数(因为它们会被垃圾收集),这有什么关系?有人能详细说明一下吗?我

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

  • 将XML发送到远程服务器进行报告(在事务完成后)
  • 在用户上传图像后,重新调整图像大小并将缩略图上传到S3
  • 用户从其帐户中删除图像对象后,从S3中删除旧图像

  • 我是否完全偏离了基准(我觉得我可能是)我是否收到信号和多线程混淆?如果是,它们在应用程序中是否进行比较?它们只是为了脱钩吗?另外,要确保尽早实例化它们,并且不使用本地函数(因为它们会被垃圾收集),这有什么关系?有人能详细说明一下吗?我应该把它们都放在请求中间件中,这样我就不用担心了吗?

    Django信号是一种执行动作
    a
    以响应事件
    E
    的方法

    在一个不真实的世界中,您可以通过修改事件
    E
    发生的代码并附加代码来执行动作
    a
    来避免使用信号

    问题是这样做会降低可维护性、可读性和许多其他软件工程形容词:)

    信号允许您独立于事件
    E
    发生的位置或方式来执行相同的操作,因此可以以一种巧妙的方式来执行,从而实现可维护性、可读性等

    是的,我认为说信号有助于实现解耦确实是正确的

    (您还提到了多线程。如果您这样做是因为您认为信号是好的,因为它们是并发执行的,而且执行速度很快……嗯……我不知道它们是否是并发执行的,但无论如何,我真的不认为这是django信号有用的原因)

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

    以下是一个可能有帮助的示例


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

    我将使用异步任务队列之类的东西执行任务2和3(图像内容),如

    这与多线程类似。

    信号不是异步的(不是以并发或并行方式运行) 这就是为什么它们对你提到的事情不那么有用的原因:

    • 文件上载或文件后处理
    • 报告生成
    • 任何其他长期操作(对其他服务器的请求,ET)
    更好的工人能够以真正异步的方式进行长期操作

    但在一些有限的场景中,它们仍然很有价值
    • 扩展第三方库的功能。如果您使用的应用程序的模型不受代码控制,那么在保存或删除时采取特定操作时,信号是比猴子补丁更可靠的替代方法
    • 删除信号使用删除查询集方法。如果您希望在单个对象和queryset删除上都发生相同的操作,那么信号可能是您最好的选择。
      注意:由于SQL的生成方式,这不适用于update queryset方法(使用save信号)。另一个常见的混淆/错误源
    • 当您需要对多个型号应用相同的信号处理程序时。如果您只有一些,我仍然倾向于重写save/delete方法并调用共享函数。对于大多数人来说,在任何地方复制/粘贴save方法都更容易出错,信号看起来是一个更好的选择
    • 避免紧密的跨应用程序依赖关系。如果您需要跨越应用程序边界,特别是当应用程序可能用于多个项目时,信号可能更适合应用程序之间的松散耦合。不过要小心这个。使用它是因为你需要,而不是因为你认为你将来可能需要它

    您可以找到这些案例和一些示例。

    我不理解您提到的多线程。有什么意义?@Andrea Zilio请看关于答案1的评论,Jango信号肯定是同步发送的。@Ignacio我的目的不是说信号是并发执行的,只是想想象一下问题中提到多线程的原因。。。我不知道他们是怎么处理的。现在我知道了。谢谢伊格纳西奥;)你会认为我的列表中的3个任务是通过信号来执行的吗?我提到多线程的原因不是为了并发利益,而是因为用户看到“谢谢”页面并且完成了加载,但是服务器中的事情仍然在进行。这可能吗?任务1,不可能。只需将代码上传到事务代码之后。任务2,当然。但你最好还是把农业完全分开来处理。任务3,可能的话,尽管在任务中使用“delete”一词如果做得不好,可能会导致racy代码。