Yan*_*ang 6 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()
Run Code Online (Sandbox Code Playgroud)
当我运行127.0.0.1:5000时,我希望得到"hello11",但我得到"hello21",为什么?
Abe*_*lus 14
问题是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
Run Code Online (Sandbox Code Playgroud)
哪个会起作用,但不如标准库解决方案那么优雅,
from functools import wraps
def add1(f):
@wraps(f)
def inner(*args, **kwargs):
return str(f(*args, **kwargs))+'1'
return inner
Run Code Online (Sandbox Code Playgroud)
该wraps装饰不仅修复了名字,但文档字符串,该文件,属性字典.