在 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)