【问题标题】:Django Signal stuck in loopDjango Signal卡在循环中
【发布时间】:2020-08-04 08:14:28
【问题描述】:

我有 3 个信号函数,其中一个在被调用时陷入循环。当模型类中的对象在 Django 管理页面上更新时调用它...

# models.py
class Item(models.Model):
    ...
    foo = models.BooleanField(
        default=False,
        editable=True,
        blank=True,
        help_text='Blah Blah...'    
    )
# signals.py
@receiver(pre_save, sender=Item)
def foobar(sender, instance, **kwargs):
    try:
        pass
    except:
        pass

我确实在每个tryexcept 中加入了pass,并调用了一个日志,只是为了看看它是否在重复,即使没有代码也在其中,确实如此。不断地没有尽头。这也是使用if / else 语句而不是try / except 来实现的。

我怎么能阻止信号卡在循环中?它应该每次都发送一封电子邮件,但现在当对象更新时,用户会收到无限的电子邮件,直到我重新启动 Django。

我真的很茫然……

顺便说一句,这不会发生在我的测试服务器上,只会发生在我的实时/临时服务器上。

编辑

如果您将来查看此内容,这就是我调试问题的方式。

寻找任何正在运行/命中您的服务器并可能引发signal 运行的东西。对我来说,它是一个特定的对象,被设置为sender 以运行信号,每次我使用的 webhook 都会导致一个函数运行,它正在修改特定的 sender object

【问题讨论】:

  • 你的意思是except Exception 对吗?因为除了单独发生在每个动作中。我不明白你的邮件系统是如何工作的,但你不应该单独使用
  • @LinhNguyen 让我很尴尬。我什至没有想到这一点。所以澄清一下,你是说在 try 中的每一个动作之后都会运行 except 吗?还是在尝试结束时运行?
  • 我认为这个答案比我解释的更好stackoverflow.com/a/730778/11225821
  • 我会检查一下@LinhNguyen,谢谢。但是,我必须提到,我的其他信号以相同的方式设置并且运行没有问题。
  • 您尝试过在登台服务器上调试吗?只需将 print 添加到 try catch 案例中,看看它是否打印很多,如果没有,那么发送电子邮件功能一定有问题

标签: python django signals


【解决方案1】:

所以我很犹豫是否将其发布为“答案”,因为这可能只会为我自己的问题提供理由,但我已经弄清楚发生了什么......

我最近将一个 Webhook 连接到我的 Django 应用程序,它会不断地点击它并更新信息...我已将我的 webhook 函数修复为只点击模型对象(上面,它是 @ 987654321@) 以减少信号运行的次数。

但是,这是对运行到完成的信号的字面修复:

# signals.py
...

obj = sender.objects.get(pk=instance.pk)

# We are checking if the instance value is different than what the object value
# is. Remember, this is PRE_SAVE, so the object should be different than the
# instance
if instance.variable and not obj.variable:
    ...

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2015-05-27
    • 2010-12-17
    相关资源
    最近更新 更多