2015-01-27 3 views
1

Я понимаю, что есть много других вопросов, связанных с пользовательскими сигналами django, которые не работают, и поверьте мне, я прочитал их все несколько раз, не повезло, чтобы заставить мою личную ситуацию работать.Пользовательские сообщения Django не работают

Это сделка: Я использую django-rq для управления длительным фоновым процессом, который задается конкретным HTTP-запросом. Когда этот фоновый процесс будет завершен, я хочу, чтобы он отключил пользовательский сигнал Django, чтобы django-rq можно было проверить на отсутствие/исключение задания.

Два приложения, оба из списка INSTALLED_APPS, находятся на одном уровне. Внутри App1 есть файл: signals.py

import django.dispatch 

file_added = django.dispatch.Signal(providing_args=["issueKey", "file"]) 
fm_job_done = django.dispatch.Signal(providing_args=["jobId"]) 

, а также файл jobs.py

from app1 import signals 
from django.conf import settings 

jobId = 23 
issueKey = "fake" 
fileObj = "alsoFake" 

try: 
    pass 
finally: 
    signals.file_added.send(sender=settings.SIGNAL_SENDER,issueKey=issueKey,fileName=fileObj) 
    signals.fm_job_done.send(sender=settings.SIGNAL_SENDER,jobId=jobId) 

затем внутри app2, в views.py

from app1.signals import file_added, fm_job_done 
from django.conf import settings 

#Setup signal handlers 
def fm_job_done_callback(sender, **kwargs): 
    print "hellooooooooooooooooooooooooooooooooooo" 
    logging.info("file manager job done signal fired") 

def file_added_callback(sender, **kwargs): 
    print "hellooooooooooooooooooooooooooooooooooo" 
    logging.info("file added signal fired") 

file_added.connect(file_added_callback,sender=settings.SIGNAL_SENDER,weak=False) 
fm_job_done.connect(fm_job_done_callback,sender=settings.SIGNAL_SENDER,weak=False) 

Я не получаю отзывов вообще, хотя и при полной потере. Я знаю, на самом деле, что jobs.py выполняется, и, следовательно, также, что блок кода, который должен запускать сигналы, также выполняется, так как он находится в блоке finally (ни одна попытка не пуста - я просто помещаю проход туда для простоты) Пожалуйста, не стесняйтесь спрашивать дополнительную информацию - я отвечу как можно скорее.

+0

с той же проблемой, вы когда-нибудь найти решение для этого? Это определенно проблема с django-rq, поскольку приемник сигнала отлично работает с 'async = False' – SColvin

+0

@SColvin Привет. Нет, боюсь, я никогда не нашел решения. Следующий ответ, конечно, не помог решить мою проблему. С тех пор я перешел к другой парадигме, полагающейся в большей степени на django-rq и http-запросы. – pooley1994

ответ

0

использование Джанго receiver декоратор

from django.dispatch import receiver 
from app1.signals import file_added, fm_job_done 

@receiver(fm_job_done) 
def fm_job_done_callback(sender, **kwargs): 
    print "helloooooooooooooo" 


@receiver(file_added) 
def file_added_callback(sender, **kwargs): 
    print "helloooooooooooooo" 

Кроме того, я предпочитаю, чтобы обрабатывать сигналы в models.py

+0

Не могли бы вы рассказать о том, что именно вы подразумеваете под «ручками сигналов в models.py»? – pooley1994

+0

@ pooley1994 определяет сигналы обратных вызовов в models.py – levi

+0

Ok. Ну, просто использование декоратора вместо оригинального метода ничего не изменило. – pooley1994