【问题标题】:Is there a way to list Django signals?有没有办法列出 Django 信号?
【发布时间】:2010-11-08 10:23:51
【问题描述】:

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

【问题讨论】:

    标签: django signals django-signals


    【解决方案1】:

    有一个 django 应用程序叫做 django-debug-toolbar 在所有 django 服务页面的顶部添加了一个小工具栏,提供与页面渲染后端相关的信息,例如执行了多少查询,每个查询花费了多少时间等。它还打印出信号。我不在我的应用中使用信号,所以我从未使用过该功能,但它就在那里。

    【讨论】:

      【解决方案2】:

      它并没有真正在文档中公开,但 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
      

      【讨论】:

      • 您列出了 7 个信号,这些都是正确的。但是要通过算法获得列表,from django.db.models import signals 然后[s for s in vars(signals).values() if isinstance(s, signals.ModelSignal)]
      • 另外,通过使用该列表,我发现post_syncdb 似乎已重命名为post_migrate
      【解决方案3】:

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

      您可以将其修改为仅显示信号。

      【讨论】:

        【解决方案4】:

        如果您只想列出特定型号上特定信号的连接接收器,您可以查看_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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-20
          • 2020-01-14
          相关资源
          最近更新 更多