Django装饰器,带有多个视图的参数

时间:2012-12-27 10:22:29

标签: python django decorator

我在我的项目中使用django装饰器。 我使用带参数的多个视图,我需要调用1个装饰器。

我只希望一个视图使用其参数调用一次。但是装饰者在我使用装饰器的地方给出了每个视图的值。

我希望这个论点属于我所称的特定观点。

我的观点和装饰作为:

def d(msg='my default message'):
    def decorator(func):
        print msg
        def newfn(request, **kwargs):
            return func(request, **kwargs)
        return newfn
    return decorator

@d('This is working')
def company_add(request):
   return ...

@d('Dont come')
def company_list(request, comp_id = None):
   return ...

如果我调用company_add视图,我将输出视为:

This is working
Dont come

但我的预期结果是

This is working.

任何人都可以帮我打印属于特定视图的参数。

2 个答案:

答案 0 :(得分:3)

当您使用@d(arg)包装函数时,实际上在运行修饰函数之前使用d运行msg=arg函数的主体,当然会打印msg。您可以将print语句放在其他位置,例如:

def d(msg='my default message'):
    def decorator(func):
        def newfn(request, **kwargs):
            print msg
            return func(request, **kwargs)
        return newfn
    return decorator

答案 1 :(得分:2)

解决方案是将print msg移动到newfn包装器的范围。当您使用指定的参数调用装饰器时,它会执行并导致上述行为。

def d(msg='my default message'):
    def decorator(func):
        def newfn(request, **kwargs):
            print msg # The message should be printed here.
            return func(request, **kwargs)
        return newfn
    return decorator