我想使用装饰器来处理各种函数的审计(主要是Django视图函数,但不是唯一的)。为了做到这一点,我希望能够审计函数执行后 - 即函数正常运行,如果它返回没有异常,则装饰器记录事实。
类似的东西:
@audit_action(action='did something')
def do_something(*args, **kwargs):
if args[0] == 'foo':
return 'bar'
else:
return 'baz'
audit_action
仅在函数完成后运行。
答案 0 :(得分:34)
装饰器通常返回一个包装函数;只需在调用包装函数后将逻辑放在包装函数中。
def audit_action(action):
def decorator_func(func):
def wrapper_func(*args, **kwargs):
# Invoke the wrapped function first
retval = func(*args, **kwargs)
# Now do something here with retval and/or action
print 'In wrapper_func, handling action {!r} after wrapped function returned {!r}'.format(action, retval)
return retval
return wrapper_func
return decorator_func
所以audit_action(action='did something')
是一个装饰工厂,它返回一个范围decorator_func
,用于装饰你的do_something
(do_something = decorator_func(do_something)
)。
装饰后,do_something
引用已替换为wrapper_func
。调用wrapper_func()
会导致原始do_something()
被调用,然后您在包装器函数中的代码可以执行操作。
上面的代码与您的示例函数相结合,提供了以下输出:
>>> do_something('foo')
In wrapper_func, handling action 'did something' after wrapped function returned 'bar'
'bar'
答案 1 :(得分:3)
你的装饰者可以在这里处理它,比如
def audit_action(function_to_decorate):
def wrapper(*args, **kw):
# Calling your function
output = function_to_decorate(*args, **kw)
# Below this line you can do post processing
print "In Post Processing...."
return output
return wrapper