Почему post_save повышает дважды во время сохранения модели Django?

Я присоединяю метод к 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 подключается многократно.

Каков был бы лучший способ выяснить, почему он импортируется/выполняется дважды?

15
задан Lance McNearney 27 February 2010 в 01:38
поделиться

3 ответа

Очевидно, 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',
)
12
ответ дан 1 December 2019 в 03:52
поделиться

В поисках корня этой проблемы вы можете использовать быстрое решение, чтобы предотвратить регистрацию сигнала дважды:

signals.post_save.connect(my_handler, MyModel, dispatch_uid="path.to.this.module")

Источник .

7
ответ дан 1 December 2019 в 03:52
поделиться

Вот билет по этой проблеме: Фреймворк сигналов Django может регистрировать слушателей более одного раза # 3951 . Теперь это исправлено в SVN-версии Django.

Проблема в том, что вы сказали: ваш модуль, который регистрирует сигнал, загружается несколько раз, в некоторых случаях по разным путям импорта, поэтому каждый импортированный таким образом модуль ошибочно интерпретируется Django как разные модули, которые регистрируют один и тот же сигнал. .

0
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: