Сигнал Джанго испускается один раз, принимается дважды - почему?

Я работаю с сигналами Django, но они, кажется, принимаются дважды, даже если они испускаются один раз. Вот код, с которым я работаю (это простая оболочка для использования Uploadify с Django)...

# Signal-emitting code... emits whenever a file upload is received
# ----------------------------------------------------------------
upload_recieved = django.dispatch.Signal(providing_args=['data'])

def upload(request, *args, **kwargs):
    if request.method == 'POST':
        if request.FILES:
            print 'sending signal'
            upload_recieved.send(sender='uploadify', data=request.FILES['Filedata'])
    return HttpResponse('True')

# Signal-receiving code...
# ----------------------------------------------------------------    
def upload_received_handler(sender, data, **kwargs):
    print 'upload received handler'

print 'connecting signal'
upload_recieved.connect(upload_received_handler)

(Я только что заметил, что мой сигнал написан неправильно)

Я уверен, что вы заметили там печатные заявления. На консоли это то, что он показывает:

(server starts)
connecting signal

...

sending signal
upload received handler
upload received handler     # << == where is this 2nd one coming from?
127.0.0.1 - - [25/Sep/2009 07:28:22] "POST /uploadify/upload/ HTTP/1.1" 200 -

(также странно, почему Django сообщает страницу POST после срабатывания сигналов?)

1 ответ

Решение

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

upload_recieved.connect(upload_received_handler, dispatch_uid="some.unique.string.id")

ОБНОВЛЕНИЕ Это фактически зарегистрировано здесь: http://code.djangoproject.com/wiki/Signals

Вы можете проверить аргумент created в вашей функции, которую вы подключаете к сигналу, который возвращает True и False соответственно.

def task_feedback_status_handler(sender, instance, created, **kwargs):
do something
post_save.connect(task_feedback_status_handler, sender=Feedback)
Другие вопросы по тегам