这是我的例子:
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/