2014-04-12 63 views
1

我一直在試圖對一種方法來處理在運行時創建的信號創建工作的信號,我想出了下面的代碼,從配置/表讀和登記post_save連接Django的在運行時

def _send_to_messaging_notify(**kwargs): 
    """ _send_to_messaging_notify 
    """ 
    if kwargs.get('created'): 
     instance = kwargs.get('instance') 
     ct = ContentType.objects.get_for_model(instance) 
     notify.apply_async(args=[instance.pk, ct.pk, kwargs.get('when')]) 


def create_function(name, args): 
    def y(**kwargs): 
     kwargs.update({'when': inspect.stack()[0][3]}) 
     print 'signal executed on {0}'.format(kwargs.get('sender')) 
     _send_to_messaging_notify(**kwargs) 

    y_code = types.CodeType(args, \ 
          y.func_code.co_nlocals, \ 
          y.func_code.co_stacksize, \ 
          y.func_code.co_flags, \ 
          y.func_code.co_code, \ 
          y.func_code.co_consts, \ 
          y.func_code.co_names, \ 
          y.func_code.co_varnames, \ 
          y.func_code.co_filename, \ 
          name, \ 
          y.func_code.co_firstlineno, \ 
          y.func_code.co_lnotab) 

    return types.FunctionType(y_code, y.func_globals, name) 


def load_signals(): 
    """ load_signals 
    """ 
    from default_senders import senders 
    # 
    for k in senders.iterkeys(): 
     post_save.connect(create_function(str(k), 0), sender=load_model(senders[k].get('default_content_type')), 
          dispatch_uid=k) 


load_signals() 

create_function是在運行時創建的信號處理程序,那麼它被稱爲與post_save.connect

當我嘗試執行此

myfunc = create_function(str(k), 0) 
myfunc(sender='xxx') 

它的工作原理很好,但是當它被hook到post_save.connect時,它在目標模型收到post_save操作時什麼都不做。這種情況發生了什麼想法?任何一個可以提醒請

回答

1

我沒有看到你所創建的信號post_save並在code.In load_signals發送信號(),包括以下幾行代碼開頭

from django.dispatch import Signal 
post_save = Signal(providing_args=['arg1', 'arg2']) 

然後,你可以使用

post_save.connect(create_function(str(k), 0)) 

在連接信號迴路到接收器的功能和使用發送

0123的信號
post_save.send(sender='a_cool_sender', arg1='Hello!', arg2=1) 

我在網上找到的最好的文章清楚地解釋了Django信號是here