python - Flask app.add_url_rule in decorator error -


i have bunch of decorators in flask routes trying condense 1 (including @app.route).

i have following @route function:

from functools import wraps def route(route, method):     def decorator(f):         print 'decorator defined'         print 'defining route'         app.add_url_rule(route, methods=method, view_func=f)         print 'route defined'         @wraps(f)         def wrapper(*args, **kwargs):             print 'hello'             # stuff here such authenticate, authorise, check request json/arguments etc.             # these passed along route , method arguments above.             return f(*args, **kwargs)         return wrapper     return decorator 

and sample route:

@route('/status', ['get']) def status():     return response('hi', content_type='text/plain') 

the route getting defined, wrapper() never gets called, odd. when move app.add_url_rule outside of decorator end of file, wrapper() gets called; decorator defined statement prints on flask startup, , hello prints when hit get /status route expected.

however, when put app.add_url_rule decorator shown above, decorator defined prints on startup when call get /status, not print hello if app.add_url_rule overrides wrapper() function defined somehow.

why happen? looks app.add_url_route hijacks function in odd/unexpected way.

how can wrapper() called once route hit, while defining app.add_url_rule in decorator?

you registered original function, not wrapper, flask. whenever route matches, flask calls f, not wrapper, because that's registered route.

tell flask call wrapper when route matches, instead:

def route(route, method):     def decorator(f):         print 'decorator defined'         print 'defining route'         @wraps(f)         def wrapper(*args, **kwargs):             print 'hello'             # stuff here such authenticate, authorise, check request json/arguments etc.             # these passed along route , method arguments above.             return f(*args, **kwargs)          app.add_url_rule(route, methods=method, view_func=wrapper)         print 'route defined'         return wrapper     return decorator 

Comments

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -