Получение дублирующих сигналов. Как искать причину?

Я написал сигнал Django в __init__.py моего проекта. выглядит так:

from django.db.models.signals import post_save
from paypal.standard.ipn.models import PayPalIPN

def confirm_paypal_payment(sender, **kwargs): 
    obj = kwargs['instance']
    ...
    ...

post_save.connect(confirm_paypal_payment, sender=PayPalIPN, dispatch_uid="confirm_paypal_payment")

Этот сигнал ожидает сохранения в этой модели, https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/models.py

Я застрял и не могу понять, почему я продолжаю получать повторяющиеся сигналы, я прочитал документацию, и там сказано, что я должен использовать dispatch_uid, чтобы предотвратить это. Но даже при использовании dispatch_uid я продолжаю получать дублирующиеся сигналы.

Любые идеи о том, как найти основную причину этого? Я использую Джанго 1.6.2.


person André    schedule 10.06.2014    source источник
comment
Я удалил django-paypal, потому что ваш вопрос больше о сигналах, так получилось, что вы также используете django-paypal PayPal, но это всплыло бы, даже если бы вы не были :)   -  person Burhan Khalid    schedule 10.06.2014


Ответы (1)


Переместите его из своего __init__.py и сохраните либо signals.py (новый файл, который находится в каталоге вашего приложения, там же, где и views.py), либо в вашем models.py, что рекомендуется в документация:

Вы можете поместить код обработки сигналов и регистрационный код где угодно. Однако вам нужно убедиться, что модуль, в котором он находится, импортирован на ранней стадии, чтобы обработка сигналов была зарегистрирована до того, как какие-либо сигналы должны быть отправлены. Это делает models.py вашего приложения хорошим местом для регистрации обработчиков сигналов.

__init__.py — очень плохое место для размещения такого кода, потому что есть большая вероятность, что он будет выполнен более одного раза.

person Burhan Khalid    schedule 10.06.2014
comment
Спасибо за ответ Бурхан. Как называется signals.py? Я должен куда-то импортировать сигналы? - person André; 10.06.2014
comment
Вы можете импортировать его в свой models.py или поместить код непосредственно в models.py, как рекомендовано в документации. Смотрите мою правку. - person Burhan Khalid; 10.06.2014
comment
Модель представляет собой стороннее приложение, которое находится на virtualenv. Каковы лучшие практики для этого варианта использования? - person André; 10.06.2014
comment
Это не обязательно должен быть точный файл models.py, вы можете поместить его в свой собственный файл models.py, просто сначала убедитесь, что вы импортируете сторонние модели. - person Burhan Khalid; 10.06.2014