4

试图记录使用装饰器运行函数所需的时间,但我误解了一些东西。它拒绝写入登录装饰器。

当你颠倒装饰器的顺序时,它会导致模板上的构建错误(就像信息丢失一样)。

在我的初始化 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)
4

2 回答 2

1

使用print_elapsed_timeFlask 的route装饰器上面的装饰器,由 注册的函数route还没有被 修改print_elapsed_time,因为装饰器是从下到上应用的。解决方案是放在@print_elapsed_time两个route装饰器下方。但是,Flask 会通过名称跟踪其注册函数,并且对于由print_elapsed_timethis包裹的所有内容是wrapper。有关解决此问题的方法,请参阅我对另一个 StackOverflow 问题的回答。

于 2013-08-26T21:21:42.633 回答
0

以下是基于 Abe 洞察力的代码片段:

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)

于 2020-07-08T19:06:17.580 回答