擅长:python、mysql、java
<p>其他的答案似乎没有,当您切换装饰器的顺序时,您从“/foo”得到的响应是“bar”。除非手动更新<code>__name__</code>、<code>__module__</code>等,否则必须在此处使用<code>@wraps</code>。Flask使用你的方法有点像singleton,把你的装饰器看作是<code>wrapped()</code>方法,而不是你实际包装的方法。因此,使用decorator的最后一个方法将不断覆盖您的路由。</p>
<pre><code>import datetime
from functools import wraps
from flask.app import Flask
app = Flask(__name__)
app.config.from_object(__name__)
app.debug = True
def track_time_spent(name):
def decorator(f):
@wraps(f)
def wrapped(*args, **kwargs):
start = datetime.datetime.now()
ret = f(*args, **kwargs)
delta = datetime.datetime.now() - start
print name, "took", delta.total_seconds(), "seconds"
return ret
return wrapped
return decorator
@app.route('/foo')
@track_time_spent('foo')
def foo():
print "foo"
return "foo"
@app.route('/bar')
@track_time_spent('bar')
def bar():
print "bar"
return "bar"
app.run(host='0.0.0.0', port=8888)
</code></pre>