在 Python 中创建一个使用另一个包装器的包装器
Creating a wrapper in Python which uses another wrapper
我在 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_or_token
中的 require_domain
?
我们正在使用 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
装饰器require_domain
也是returns包装器(函数),所以你需要调用它:
return require_domain(method)(self, *args, **kwargs)
我在 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_or_token
中的 require_domain
?
我们正在使用 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
装饰器require_domain
也是returns包装器(函数),所以你需要调用它:
return require_domain(method)(self, *args, **kwargs)