如何将结果从python装饰器传递给我的班级?

时间:2019-12-12 02:04:39

标签: python python-decorators

我使用龙卷风和jwt装饰器,如下所示:

def jwtauth(handler_class):
    """
        Tornado JWT Auth Decorator
    """
    def wrap_execute(handler_execute):
        def require_auth(handler, kwargs):

            auth = handler.request.headers.get(AUTHORIZATION_HEADER)
            if auth:
                parts = auth.split()

                if not is_valid_header(parts):
                     return_header_error(handler)

                token = parts[1]                            
                try:                   
                    result = jwt.decode(
                        token,
                        SECRET_KEY,
                        options=jwt_options
                    )                
                except Exception as err:
                    return_auth_error(handler, str(err))

            else:
                handler._transforms = []
                handler.write(MISSING_AUTHORIZATION_KEY)
                handler.finish()

            return result

        def _execute(self, transforms, *args, **kwargs):

            try:
                result = require_auth(self, kwargs)
            except Exception:
                return False

            return handler_execute(self, transforms, *args, **kwargs)

        return _execute

    handler_class._execute = wrap_execute(handler_class._execute)
    return handler_class

@jwtauth
class MyHandler(tornado.web.RequestHandler):    
    def post(self):
        unit = json.loads(self.request.body.decode('utf-8'))
        # TODO:
        # get the result from jwtauth decorator and use it here

        print(result) # The result from jwtauth

现在,我想获取jwt解码结果并将其传递给MyHandler进行进一步验证。我可以做吗?我检查了大多数注释,可以将参数传递给装饰器,但无法从中获取。可以将jwtauth结果传递给我的函数吗?

1 个答案:

答案 0 :(得分:1)

类装饰器将带您的类并吐出类的新版本(通常会添加一些功能)。在这种情况下,@jwtauth装饰器将带您的类并吐出一个新类,以确保检查每个请求以查看授权标头中的有效JWT令牌。 tornado.web.RequestHandler._execute internally calls post。当前的行为是,如果JWT令牌身份验证失败,则将永远不会调用post

简而言之,您可能只想在下面引发一个错误,而不是返回False。

        try:
            result = require_auth(self, kwargs)
        except Exception:
            return False

如果您需要添加更多有关引发哪种错误的逻辑,那么您可能希望将其与类一起传递给装饰器。