【问题标题】:django creating signals at runtimedjango 在运行时创建信号
【发布时间】:2014-04-12 16:13:45
【问题描述】:

我一直在尝试一种在运行时处理信号创建的方法,我想出了以下代码,它从配置/表中读取并注册 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 操作时它什么也不做。有什么想法吗?谁能给点建议

【问题讨论】:

    标签: django


    【解决方案1】:

    我没有看到您在代码中创建信号 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 信号的最好文章是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 2021-09-24
      • 2011-06-04
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多