计算Python的Flask中每个页面的执行时间

问题描述 投票:0回答:7

使用Python的Flask库计算每个页面加载的执行时间的好方法是什么?

我正在考虑在views/__ init__.py中放置一个启动计时器:

@app.before_request
def before_request():
  g.start = time.time()

但是我应该把计时器的结束部分放在哪里来计算差异,以及如何将其放入 html 模板的页脚中?

谢谢。

python flask
7个回答
21
投票

其他答案基本上是正确的,但现在已经过时了。

以下适用于 Python 3.6 / 3.7 和 Flask 1.0.2:

import time
from flask import g

@app.before_request
def before_request():
    g.start = time.time()

@app.after_request
def after_request(response):
    diff = time.time() - g.start
    if ((response.response) and
        (200 <= response.status_code < 300) and
        (response.content_type.startswith('text/html'))):
        response.set_data(response.get_data().replace(
            b'__EXECUTION_TIME__', bytes(str(diff), 'utf-8')))
    return response

通过使用

response.set_data
,Flask 将正确更新内容长度。另请注意字节字符串的使用和编码。


16
投票

放入

teardown_request
函数中:

@app.teardown_request
def teardown_request(exception=None):
    diff = time.time() - g.start
    ...

teardown_request
中,您不允许更改响应,如果您想在响应中使用计算出的字符串,请使用
after_request

@app.after_request
def after_request(response):
    diff = time.time() - g.start
    if (response.response):
        response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff))
    return response

3
投票

您还需要更新内容长度标头,否则浏览器会感到不安(Chrome 似乎会给出不可预测的结果)。

@app.after_request
def after_request(response):
    diff = time.time() - g.start
    if app.debug:
        print "Exec time: %s" % str(diff)

    if (response.response):
        response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff))
        response.headers["content-length"] = len(response.response[0])

    return response

3
投票

试试这个:https://code-maven.com/flask-display-elapsed-time

import time
from flask import Flask, request, render_template, g
app = Flask(__name__)
 
 
@app.before_request
def before_request():
   g.request_start_time = time.time()
   g.request_time = lambda: "%.5fs" % (time.time() - g.request_start_time)
 
 
@app.route("/")
def main():
    return render_template('main.html')

和模板 html 类似:

<html>
<head>
</head>
<body>
<h1>Show elapsed time</h1>
 
<hr>
Elapsed time: {{ g.request_time() }}
</body>
</html>

1
投票

我在使用 Peter Farmer 的答案提供静态文件时遇到了“管道错误”,以及重定向问题(HTTP 301),因此我调整了提供的代码(如果有帮助的话)。

@app.after_request
def after_request(response):
    diff = int((time.time() - g.start) * 1000)  # to get a time in ms

    if (response.response and response.content_type.startswith("text/html") and response.status_code==200):
        response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff))

    return response

0
投票

如果您只想记录请求所经过的时间,那么使用 Timer for Python 中的 函数装饰器来实现这一点怎么样?

例如,您不必具有

before_request()
after_request()
函数。您可以简单地将整个请求合并到一个方法中:

from timer import function_timer

@function_timer()
def request():
    # Insert your code here

request()

它在终端中的显示方式:

Elapsed time: 0.12 seconds for thread REQUEST

如果要自定义默认输出,可以设置不同的线程名称或小数点,例如:

Elapsed time: 0.12345 seconds for thread CUSTOM_REQUEST

完全公开,我是 Timer for Python 的作者。它是一个轻量级的软件包,可以轻松测量时间和性能。


-2
投票

这里的这个已用属性怎么样

解决方案在这里

>>> import requests >>> r = requests.get('https://google.com') >>> r.elapsed.total_seconds() 0.216452 >>> r.elapsed.seconds 0 >>> r.elapsed.microseconds 216452
    
© www.soinside.com 2019 - 2024. All rights reserved.