Я присоединяю метод к post_save сигналу моей модели Django. Таким образом, я могу очистить некоторые кэшируемые элементы каждый раз, когда модель изменяется.
Проблема, которую я имею, состоит в том, что сигнал инициирован дважды, когда модель сохраняется. Это не обязательно повреждает что-либо (код будет просто корректно ошибка), но это не может быть правильно.
Быстрый пример, просто печатая модель к консоли (использующий dev сервер):
from blog.models import Post
from django.db.models import signals
def purge_cache(sender, **kwargs):
print 'Purging %s' % sender
signals.post_save.connect(purge_cache, sender=Post)
Это использует стабильные 1.1.1 выпуска Django.
Обновленная информация:
С обратной связью от общих комментариев я изменил свой вопрос, потому что проблема теперь обнаруживает, почему post_save инициирован дважды. Мое предположение в данный момент - то, что мой код models.py импортируется дважды и что post_save подключается многократно.
Каков был бы лучший способ выяснить, почему он импортируется/выполняется дважды?
Очевидно, Python чувствителен к способу импорта модулей . В моем случае это не проблема с кодом импорта в моем приложении блога, а проблема с конфигурацией INSTALLED_APPS, которая, как я полагаю, используется Django для первоначального импорта.
В моем приложении для блога я использовал импорт, например:
from blog.models import *
Мой settings.py был настроен как:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
...snip...
'sorl.thumbnail',
'mysite.blog',
)
Префикс «mysite» был добавлен, потому что у меня изначально были проблемы с путями импорта при развертывании сайта. Позже я исправил эту проблему (чтобы он работал так же, как сервер разработки), добавив несколько путей в свой сценарий WSGI.
Удаление префикса «mysite» из settings.py устранило проблему:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
...snip...
'sorl.thumbnail',
'blog',
)
В поисках корня этой проблемы вы можете использовать быстрое решение, чтобы предотвратить регистрацию сигнала дважды:
signals.post_save.connect(my_handler, MyModel, dispatch_uid="path.to.this.module")
Источник .
Вот билет по этой проблеме: Фреймворк сигналов Django может регистрировать слушателей более одного раза # 3951 . Теперь это исправлено в SVN-версии Django.
Проблема в том, что вы сказали: ваш модуль, который регистрирует сигнал, загружается несколько раз, в некоторых случаях по разным путям импорта, поэтому каждый импортированный таким образом модуль ошибочно интерпретируется Django как разные модули, которые регистрируют один и тот же сигнал. .