我一直在尝试一种在运行时处理信号创建的方法,我想到了以下代码,该代码从配置/表中读取并注册post_save连接
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')
它工作正常,但是当挂接到post_save.connect时,当目标模型接收到post_save操作时,它什么也没做。有人可以请教吗
我看不到要在哪里创建信号post_save并在代码中发送信号。在load_signals()中,在开头包含以下代码行
from django.dispatch import Signal
post_save = Signal(providing_args=['arg1', 'arg2'])
然后,您可以使用以下方式将for循环中的信号连接到接收器功能:
post_save.connect(create_function(str(k), 0))
并使用发送信号
post_save.send(sender='a_cool_sender', arg1='Hello!', arg2=1)
我在网上找到的最好的文章清楚地解释了Django的信号,在这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句