我为所有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"
它不再工作了。
由于我代码的其他使用者可能将这些装饰器以不同的顺序放置,因此我想确保它们以任何一种方式工作。
如何使它按任何顺序工作?
Flask文档明确指出route
装饰器必须位于最外面。除了自己修改Flask库之外,没有其他方法可以解决(这似乎是一项艰巨的任务,因为如果开发人员很容易就已经可以支持它的话)。
就像Flask在他们的文档中添加注释一样,您可以在文档中添加类似的注释(或仅引用Flask文档)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句