7

这是我的例子:

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”,为什么?

4

1 回答 1

15

问题是 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装饰器不仅修复了名称,还修复了文档字符串、文件和属性字典。

于 2012-07-16T04:48:18.237 回答