更改Flask和自定义装饰器的顺序会破坏自定义装饰器

柏油

我为所有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"

它不再工作了。

由于我代码的其他使用者可能将这些装饰器以不同的顺序放置,因此我想确保它们以任何一种方式工作。

如何使它按任何顺序工作?

Noslenkwah

Flask文档明确指出route装饰器必须位于最外面。除了自己修改Flask库之外,没有其他方法可以解决(这似乎是一项艰巨的任务,因为如果开发人员很容易就已经可以支持它的话)。

就像Flask在他们的文档中添加注释一样,您可以在文档中添加类似的注释(或仅引用Flask文档)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flask 自定义装饰器未按预期运行

Tornado 中的自定义装饰器

TypeScript中的自定义装饰器

定义自定义装饰器,例如staticmethod

应用函数并使用装饰器检查自定义异常

Django-自定义装饰器-参数未填写

菊花链式Python / Django自定义装饰器

Django自定义权限方法或装饰器

如何在Django中编写自定义装饰器?

Angular 2自定义装饰器取消订阅策略

Django:自定义装饰器:会话或重定向

Django自定义装饰器-属性错误

如何在Django中制作自定义装饰器?

类视图集的自定义装饰器

NestJs - 从自定义装饰器内的服务调用方法

创建继承自@Body()或@Param()装饰器的自定义NestJs装饰器?

将请求对象和其他参数放入自定义装饰器中

使用自定义TS装饰器的组件方法未定义Angular服务

自定义窗口类和装饰层

Angular-自定义方法装饰器,在方法的开始和结束时触发console.log()

如何对用ServiceFilterAttribute和自定义ActionFilter实现装饰的控制器进行单元测试

确保使用自定义装饰器装饰金字塔应用程序中的每个视图

Angular 7:自定义类装饰器销毁组件范围

Django Rest Framework 内部函数未在自定义装饰器中调用

自定义装饰器中的龙卷风异步动作

Django Rest-将@action与自定义装饰器一起使用

使用自定义 python 装饰器接受带有cherrypy公开端点的参数

静态解决符号值时遇到Angular AoT自定义装饰器错误

自定义属性上的可绑定装饰器是否可以锁定为 oneWay 或 oneTime?