有没有一种方法可以列出Django信号?

27

有没有一种方法可以查看在Django中设置了哪些信号?

4个回答

35

虽然文档中没有明确提到,但Signal只是一个包含一系列在事件发生时被调用的接收器的类。你可以手动检查这个列表:

from django.db.models.signals import *

for signal in [pre_save, pre_init, pre_delete, post_save, post_delete, post_init, post_syncdb]:
    # print a List of connected listeners
    print(signal.receivers)
        

5
您列出了7个信号,这是正确的。但要实现算法列表,请使用 from django.db.models import signals ,然后使用 [s for s in vars(signals).values() if isinstance(s, signals.ModelSignal)] 进行筛选。 - AlanSE
1
此外,通过使用该列表,我发现post_syncdb似乎已被重命名为post_migrate - AlanSE

12

有一个名为 django-debug-toolbar 的Django应用程序,它会在所有Django页面的顶部添加一个小工具栏,提供与页面后端呈现相关的信息,例如执行了多少个查询、每个查询所需的时间等。它还会打印出信号。我没有在我的应用程序中使用信号,所以我从未使用过该功能,但它确实存在。


9

如果您想仅列出特定模型上特定信号的已连接接收器,可以查看_live_receivers。例如,如果您想要列出名为MyModel的模型的已连接post_save钩子,可以执行以下操作:

from django.db.models.signals import post_save
from models import MyModel
print(post_save._live_receivers(MyModel))

我通过查找has_listeners的工作方式在Django源代码中发现了这种方法:https://github.com/django/django/blob/3eb679a86956d9eedf24492f0002de002f7180f5/django/dispatch/dispatcher.py#L153


1
通常使用非公共方法是一个不好的主意。它们以“_”前缀标记是有原因的。 - Alex K

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接