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
Post a Comment