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

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

Ответы

Ответ 1

Он действительно не отображается в документах, но 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

Ответ 2

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

Ответ 3

Я написал небольшую команду, которая показывает всех прослушивателей сигналов: https://gist.github.com/1264102

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

Ответ 4

Если вы хотите перечислить только подключенные приемники для определенного сигнала на определенной модели, вы можете посмотреть _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: https://github.com/django/django/blob/3eb679a86956d9eedf24492f0002de002f7180f5/django/dispatch/dispatcher.py#L153