有没有办法列出Django信号?

int*_*tar 22 django signals django-signals

有没有办法看看Django中设置了哪些信号?

kib*_*zer 31

它并没有真正暴露在文档中,但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
Run Code Online (Sandbox Code Playgroud)

  • 您列出了7个信号,这些都是正确的。但是要从算法上获得列表,`是从django.db.models导入信号`,然后是[[如果是isinstance(s,signals.ModelSignal),则为vars(signals).values()中s的s]] (2认同)

pri*_*stc 10

有一个名为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))
Run Code Online (Sandbox Code Playgroud)

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


小智 7

我写了一个显示所有信号监听器的小命令:https://gist.github.com/1264102

您可以修改它以仅显示信号.