I made a logging decorator for all HTTP calls:
def log_http_call(flask_request_getter: typing.Callable[[], flask.Request]):
def arg_wrapper(wrapped_function):
@wraps(wrapped_function)
def wrapper(*args, **kwargs):
flask_request: flask.Request = flask_request_getter()
print(f'HTTP Method {flask_request.method}: {flask_request.path}')
return wrapped_function(*args, **kwargs)
return wrapper
return arg_wrapper
@app.route('/api/all', methods=['GET'])
@log_http_call(lambda: flask.request)
def get_all():
return "Here you go"
@app.route('/api/<int:_id>/<string:name>', methods=['GET'])
@log_http_call(lambda: flask.request)
def get_one(_id, name):
return f"{name}'s ID is {_id}"
It's working this way, but if I reverse the order of the decorators to e.g.:
@log_http_call(lambda: flask.request)
@app.route('/api/all', methods=['GET'])
def get_all():
return "Here you go"
It's no longer working.
Since other consumers of my code may place these decorators in different order, I want to make sure that they work either way.
How can I make it work in any order?