我为所有HTTP调用都做了一个日志装饰器:
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}"
以这种方式工作,但是如果我将装饰器的顺序颠倒为例如:
@log_http_call(lambda: flask.request)
@app.route('/api/all', methods=['GET'])
def get_all():
return "Here you go"
不再工作。
由于我代码的其他使用者可能以不同的顺序放置这些装饰器,因此我想确保它们以任何一种方式工作。
如何使它按任何顺序工作?