【问题标题】:Receiving duplicate signals. How to search for the cause?接收重复信号。如何寻找原因?
【发布时间】:2014-06-10 11:41:12
【问题描述】:

我在我的项目的__init__.py 中写了一个 Django 信号。看起来像这样:

from django.db.models.signals import post_save
from paypal.standard.ipn.models import PayPalIPN

def confirm_paypal_payment(sender, **kwargs): 
    obj = kwargs['instance']
    ...
    ...

post_save.connect(confirm_paypal_payment, sender=PayPalIPN, dispatch_uid="confirm_paypal_payment")

此信号在此模型中等待保存,https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/models.py

我被卡住了,不明白为什么我继续收到重复的信号,我已经阅读了文档,它说我应该使用dispatch_uid 来防止这种情况。但即使使用dispatch_uid,我仍然会收到重复的信号。

关于如何找到其根本原因的任何想法?我正在使用 Django 1.6.2。

【问题讨论】:

  • 我删除了django-paypal,因为你的问题更多是关于信号的,碰巧你也在使用 django-paypal,但即使你不是这样也会出现:)

标签: django django-signals


【解决方案1】:

将其从您的__init__.py 中移出,并将其保存在signals.py(您的应用程序目录中的一个新文件,与views.py 相同的位置)或您的models.py 中,这是@ 中推荐的987654321@:

您可以将信号处理和注册代码放在您喜欢的任何位置。 但是,您需要确保它所在的模块 尽早导入,以便信号处理在之前注册 需要发送任何信号。这使您的应用程序的models.py 很好 放置信号处理程序注册的地方。

__init__.py 是一个非常糟糕的地方放置这样的代码,因为它很有可能会被多次执行。

【讨论】:

  • 感谢您的回复布尔汉。 signals.py 是如何调用的?我应该在某处导入信号吗?
  • 您可以在models.py 中导入它,或者按照文档的建议将代码直接放在models.py 中。查看我的编辑。
  • 该模型是驻留在virtualenv 上的第三方应用程序。此用例的最佳实践是什么?
  • 不一定是models.py,你可以放在你自己的models.py中,只要确保你先导入了第三方模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多