python - Why are these decorators called from outermost to innermost, not the other way round? -
i have following method inside tornado.websocket.websockethandler subclass:
@authenticate_user_async @gen.coroutine def on_message(self, data): """ callback when new message received via socket. """ # stuff... the @authenticate_user_async decorator below:
def authenticate_user_async(f): """ authentication decorator based on http://tornadogists.org/5251927/ authenticates user's credentials , sets self.current_user if valid """ @functools.wraps(f) @gen.coroutine def wrapper(self, *args, **kwargs): # stuff... f(self, *args, **kwargs) return wrapper i thought innermost decorator called first, have expected need them given:
@gen.coroutine @authenticate_user_async def on_message(self, data): ... but first version works , 1 above never called if yield keyword inside on_message() method.
why necessary use first version , not second?
(i think gave bug in answer previous question, sorry.)
the line in authenticate_user_async calls f needs changed. change this:
f(self, *args, **kwargs) to this:
yield f(self, *args, **kwargs) now swap order of decoration on_message:
@authenticate_user_async @gen.coroutine def on_message(self, data): in authenticate_user_async, "f" on_message. these 2 fixes ensure "f" coroutine , gets run completion.
Comments
Post a Comment