尝试记录使用装饰器运行函数所花费的时间,但我误解了一些东西。它拒绝写入登录装饰器。
当您颠倒装饰器的顺序时,它会导致模板上的构建错误(就像信息丢失一样)。
在我的init py:
if app.debug is not True:
import logging
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler('python.log', maxBytes=1024 * 1024 * 100, backupCount=20)
file_handler.setLevel(logging.ERROR)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
app.logger.addHandler(file_handler)
在我的views.py中:
def print_elapsed_time(func):
from time import clock
def wrapper(**kwargs):
tic = clock()
result = func(**kwargs) # this function fails to log the error below
app.logger.error("\tElapsed time for function: %.1f s" % (clock() - tic))
return result
return wrapper
@print_elapsed_time
@app.route('/index', methods=['GET','POST'])
@app.route('/index/<int:page>', methods=['GET','POST'])
def ListPosts(page = 1):
app.logger.error("got user") # works
# posts = query
return render_template('index.html', post=posts)
答案 0 :(得分:1)
使用Flask的print_elapsed_time
修饰符上方的route
装饰器,route
注册的函数尚未被print_elapsed_time
修改,因为装饰器从下到上应用。解决方案是将@print_elapsed_time
放在两个route
装饰器下面。但是,Flask通过名称跟踪其注册的功能,对于print_elapsed_time
包裹的所有内容,这是wrapper
。请参阅我的回答to another StackOverflow question了解相关方法。
答案 1 :(得分:0)
以下是基于安倍的见解的代码段:
from functools import wraps # ADD THIS
# ...
def print_elapsed_time(func):
@wraps(func) # ADD THIS
from time import clock
def wrapper(**kwargs):
tic = clock()
result = func(**kwargs)
app.logger.error("\tElapsed time for function: %.1f s" % (clock() - tic))
return result
return wrapper
# ...
@app.route('/index', methods=['GET','POST'])
@app.route('/index/<int:page>', methods=['GET','POST'])
@print_elapsed_time # MOVE FUNCTION TO HERE
def ListPosts(page = 1):
app.logger.error("got user") # works
# posts = query
return render_template('index.html', post=posts)