Django-сигналы и weakref

Столкнулся на первый взгляд с неочевидной проблемой:

def subscribe(signal):    
    u"""
    Подписывает что-то на сигнал.
    """
    def on_signal(**kwargs):
        u"""
        Выполняет какую-то обработку сигнала.
        """
        print(kwargs)

    signal.connect(on_signal)

После подписи на сигнал с помощью subscribe(signal) обработчик on_signal() не выполняется!

А все потому, что по-умолчанию Django-сигналы по-умолчанию устанавливают обработчики через weakref, а при выходе из subscribe() на on_signal() больше не остается ссылок! Поэтому GC сразу чистит его.

Способ исправить ситуацию – отключить weakref:

def subscribe(signal):    
    u"""
    Подписывает что-то на сигнал.
    """
    def on_signal(**kwargs):
        u"""
        Выполняет какую-то обработку сигнала.
        """
        print(kwargs)

    signal.connect(on_signal, weak=False)

Leave a Reply

Your email address will not be published. Required fields are marked *