1

我在我的项目中使用 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.

任何人都可以帮我打印仅属于特定观点的论点。

4

2 回答 2

3

当你用 包装函数时@d(arg),你实际上在运行修饰函数之前运行函数体dmsg=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
于 2012-12-27T10:36:06.150 回答
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
于 2012-12-27T10:41:17.063 回答