我在Python中创建包装器时遇到问题。我的包装器需要检查用户是否有令牌,如果它没有 - 调用另一个也可以单独使用的包装器。这是我的代码:
import functools
def require_domain_or_token(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
user_has_token, dd, user_draft= Security.get_user_token(self.request)
if user_has_token:
return method(self, *args, **kwargs)
else:
return require_domain(method)
return wrapper
def require_domain(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
user = Security.get_current_logged_in_user()
if not user:
logging.info("No user detected. Redirecting")
return self.redirect(login_url(dest_url = self.request.path_qs))
......
return method(self, *args, **kwargs)
return wrapper
如果用户有令牌,它可以正常工作,但如果没有,则会抛出异常:
AttributeError: 'dict' object has no attribute 'redirect'
我知道我没有正确地致电require_domain(method)
,因为我没有将self, *args, **kwargs
传递给方法。如何使用require_domain
中的require_domain_or_token
?
我们正在使用Google App Engine(但我不确定这是否重要)。
更新:我根据答案调用了该方法,但我将return
移到了函数的末尾:
def require_domain_or_token(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
user_has_token, dd, user_draft= Security.get_user_token(self.request)
if user_has_token:
returned_method = method
else:
returned_method = require_domain(method)
return returned_method(self, *args, **kwargs)
return wrapper
答案 0 :(得分:1)
Decorator require_domain
也返回包装器(函数),所以你需要调用它:
return require_domain(method)(self, *args, **kwargs)