我正在尝试使用Python装饰器来简化我的Web应用程序处理程序。
基本上我想使用装饰器来抽象检查经过身份验证的会话的代码,另一个用来检查缓存提供程序(本例中的Memcache)是否有合适的响应。
使用装饰器考虑此方法定义:
@auth.login_required
@cache.clear
def post(self, facility_type_id = None):
auth.login_required检查用户是否已登录,否则返回相应的错误消息,或执行原始函数。
cache.clear会在执行调用方法之前检查缓存是否有特定的密钥并删除它。
auth.login_required和cache.clear都希望最终执行调用方法(post)。
从我读过的内容来看,我现在正在做的事情会执行两次调用方法(post)。
我的问题是,我如何链接最终执行调用方法的装饰器,但确保它只被调用一次。
感谢任何指示,感谢您的时间。
答案 0 :(得分:4)
每个连续的装饰器接收先前包装的函数,因此函数本身仅在链的末尾被调用一次。这是一个简单的例子:
def dec1(f):
def wrapped():
print 'dec1'
return f()
return wrapped
def dec2(f):
def wrapped():
print 'dec2'
return f()
return wrapped
@dec2
@dec1
def spam(): print 'spam'
>>> spam()
dec2
dec1
spam
答案 1 :(得分:1)
你不明白装饰者是如何工作的。
两个装饰者已经“排序”了。外部函数将作为函数接收已经装饰的函数。内部函数不会被调用两次。