在Python中创建一个使用另一个包装器的包装器

时间:2016-02-10 08:31:58

标签: python google-app-engine 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中的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

1 个答案:

答案 0 :(得分:1)

Decorator require_domain也返回包装器(函数),所以你需要调用它:

return require_domain(method)(self, *args, **kwargs)