flask 中的 python 装饰器

标签 python decorator flask

这是我的例子:

from flask import Flask

app = Flask(__name__)
def add1(f):
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    return inner


@app.route('/')
@add1
def hello1():
    return "hello1";

@app.route('/hello2')
@add1
def hello2():
    return "hello2";


if(__name__ =='__main__'):
    app.run()

当我运行 127.0.0.1:5000 时,我希望得到“hello11​​”,但我得到的是“hello21”,为什么?

最佳答案

问题在于 Flask 通过名称跟踪函数,并且因为传递给 app.route(path) 的函数都称为 inner,第二个一个 (hello2) 覆盖第一个。要解决此问题,您需要将 inner 函数的名称更改为它正在装饰的函数的名称。您可以将装饰器更改为

def add1(f):
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    inner.__name__ = f.__name__
    return inner

这会起作用,但不如标准库解决方案优雅,

from functools import wraps

def add1(f):
    @wraps(f)
    def inner(*args, **kwargs):
        return str(f(*args, **kwargs))+'1'
    return inner

wraps 装饰器不仅修复了名称,还修复了文档字符串、文件和属性字典。

关于 flask 中的 python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497693/

相关文章:

python - Mongoengine Flask 获取 dbstats

python - Gunicorn 模块未发现错误

python - 如何将类装饰器与pickle一起使用?

python - 如果装饰器函数在我无法修改的库中,我应该如何捕获可以引发的装饰器函数中的异常?

python - flask 应用程序不工作

python - 从异步函数调用同步函数

python - 比较两个数据帧并出现错误

python - "RuntimeError: There is no current event loop in thread ' Thread- 2'."错误是什么意思?

python - 可以同时接受 init args 和 call args 的装饰器?

python - Flask SQLAlchemy - 仅为当前 session 设置 expire_on_commit=False