Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Show all signals receivers in Django project
# coding:utf-8
import gc
from sys import modules
import inspect
from optparse import make_option
import weakref
from django.core.management.base import BaseCommand
from django.dispatch import Signal, saferef
REF_TYPES = (weakref.ReferenceType, saferef.BoundMethodWeakref, saferef.BoundMethodWeakref)
FORMATS = {
'vim': '{path}:{line}:{name}',
'human': '{name} in line {line} of {path}',
}
class Command(BaseCommand):
help = 'Show all signals receivers'
option_list = BaseCommand.option_list + (
make_option('--format',
dest='line_format',
default='human',
choices=FORMATS.keys(),
help='Line format (available choices: {0})'.format(', '.join(FORMATS)),
),
)
def handle(self, *args, **options):
line_format = options['line_format']
if line_format not in FORMATS:
raise CommandError('format must be on of {0}, not {1}'.format(line_format, FORMATS.keys()))
msg = FORMATS[line_format]
signals = [obj for obj in gc.get_objects() if isinstance(obj, Signal)]
for signal in signals:
for receiver in signal.receivers:
_, receiver = receiver
# django.contrib.contenttypes.generic.GenericForeignKey.instance_pre_init is not weakref
if isinstance(receiver, REF_TYPES):
receiver = receiver()
print msg.format(name=receiver.func_name, line=inspect.getsourcelines(receiver)[1], path=inspect.getsourcefile(receiver))
@hugorodgerbrown

@voldmar - this is really helpful - thanks for posting. Is it possible to get the name of the Signal as well as the receiver function - I've tried myself but can't work out how to do it.

@bartekbrak

Can you please indicate, preferably in-line, what Django version this relates to (or was tested on). It does not work on 1.7 for me (ImportError: cannot import name saferef)

@runekaagaard

I made a fork here https://gist.github.com/runekaagaard/2eecf0a8367959dc634b7866694daf2c that lists only model signals by model and signal type. Tested with django 1.7.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.