简体   繁体   中英

How can I pass the result from a python decorator to my class?

I use tornado and a jwt decorator as below:

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

Now, I'd like to get the jwt decode result and pass into MyHandler for further verification. Can I do it? I checked most of the comment that I can pass the parameter to a decorator but I cannot get from it. Is is possible to pass the jwtauth result to my function?

A class decorator takes your class and spits out a new version of your class (usually with some features added to it). In this case, the @jwtauth decorator takes your class and spits out a new class that makes sure that each request is checked for a valid JWT token in the authorization header. tornado.web.RequestHandler._execute internally calls post . The current behavior is that if the JWT token auth fails, then post will never be called.

In short, you probably want to just raise an error below instead of returning False.

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

If you need to add more logic about what kind of error to raise, then you probably want to pass that into the decorator along with the class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM