Есть ли способ перечислить сигналы Django?

19

Есть ли способ увидеть, какие сигналы были установлены в Django?

    
задан interstar 06.07.2009 в 17:48
источник

4 ответа

29

В документах это действительно не отображается, но 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
    
ответ дан kibitzer 25.12.2009 в 10:12
источник
  • Вы указали 7 сигналов, и они верны. Но чтобы получить список алгоритмически, из django.db.models импортируйте сигналы, а затем [s для s в vars (signal) .values ​​(), если isinstance (s, signals.ModelSignal)] –  AlanSE 17.05.2018 в 16:17
  • Также, используя этот список, я обнаружил, что post_syncdb переименовывается в post_migrate. –  AlanSE 17.05.2018 в 16:25
10

Есть приложение django, называемое django-debug-toolbar , который добавляет небольшую панель инструментов в верхней части всех обслуживаемых страниц django, предоставляющих информацию связанные с бэкэндом рендеринга страницы, например, сколько запросов было выполнено, сколько времени они занимали и т. д. Он также выводит сигналы. Я не использую сигналы в своем приложении, поэтому я никогда не использовал эту функцию, но она есть.

    
ответ дан priestc 06.07.2009 в 17:59
источник
7

Я написал небольшую команду, которая показывает всех слушателей сигналов: Ссылка

Вы можете изменить его, чтобы показывать только сигналы.

    
ответ дан voldmar 17.11.2011 в 13:06
источник
0

Если вы хотите перечислить только подключенные приемники для определенного сигнала на определенной модели, вы можете посмотреть _live_receivers . Например, если вы хотите перечислить связанные крючки post_save для модели с именем MyModel, вы можете сделать:

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

Я нашел этот подход в исходном коде Django, посмотрев, как работает has_listeners : Ссылка

    
ответ дан gsvr 28.03.2017 в 11:56
источник