ОБНОВЛЕНИЕ Код, размещенный ниже, отлично. Я только что нашел ответ на свой вопрос: я переписывал обработчик с другим, который использовал одно и то же имя в этом модуле, поэтому 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, но, похоже, не работает для меня.
Может ли кто-нибудь пролить свет на это поведение?