我在我的项目中使用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.
任何人都可以帮我打印属于特定视图的参数。
答案 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