2015-04-23 2 views
2

ОБНОВЛЕНИЕ Код, размещенный ниже, отлично. Я только что нашел ответ на свой вопрос: я переписывал обработчик с другим, который использовал одно и то же имя в этом модуле, поэтому weakref был удален ... Другие могут использовать приведенный ниже код, чтобы правильно регистрировать сигналы в соответствии с документацией Django ,Почему сигналы Django удаляются без слабых = False?

В моем Django 1.8, Python 2.7.9 Я определяю сигнал, который никогда не вызывается. Похоже, по какой-то причине сборщик мусора. Обработчик определяется на уровне модуля, а не внутри функции, поэтому я ожидал, что он останется там, пока программа запущена. Использование weak = False при подключении сигнала решает проблему, но я хотел бы знать особенности этого поведения.

Это примерно код, я использую: не

# myapp/apps.py 

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 

    name = 'myapp' 

    def ready(self): 
     import myapp.signals 
# myapp/__init__.py 

default_app_config = 'myapp.apps.MyAppConfig' 
# myapp/signals.py 

from django.db.models.signals import post_delete 
from django.dispatch import receiver 
from otherapp.models import Model 

@receiver(post_delete, sender=Model) # weak=True 
def post_delete_hype_callback(sender, **kwargs): 
    # Do stuff here 
    pass 

post_delete сигнал на модели никогда не вызывается. Я даже не вижу его в списке подключенных сигналов. Использование weak = False на декораторе приемника решает проблему.

С моей точки зрения, декоратор приемника возвращает фактическую функцию, украшаемую, поэтому он должен оставаться на уровне модуля и никогда не собираться с мусором. Я также проверил, что обработчик подключается к сигналу, когда приложение готово (используя import myapp.signals).

Единственное разумное объяснение, которое я могу думать о том, что когда-ready() метод MyAppConfig заканчивает signals.py модуля получает мусор, поскольку нет никаких других ссылок на него в любом месте, но это не поведение я ожидал.

Это, кажется, рекомендуемый способ подключения сигналов в соответствии с документацией Django, но, похоже, не работает для меня.

Может ли кто-нибудь пролить свет на это поведение?

ответ

5

Я только что нашел ответ на свой вопрос: код был отлично, но я переписал функцию другим обработчиком, который я определил под ним с тем же именем ... -.- u Вот почему этот обработчик был сбор мусора, когда были использованы слабые стороны. Я оставлю этот вопрос, чтобы другие могли видеть, как правильно подключать сигналы в соответствии с документацией Django.

Смежные вопросы