Подтвердить что ты не робот

Вычислить время выполнения для каждой страницы в Python Flask

Какой хороший способ рассчитать время выполнения для каждой загрузки страницы с использованием библиотеки флагов Python?

Я думал о включении таймера запуска в представлениях /__ init __. py:

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

Но где бы я поставил конечную часть таймера, чтобы вычислить разницу, и как бы получить ее в нижнем колонтитуле моего html-шаблона?

Спасибо.

4b9b3361

Ответ 1

Поместите его в функцию 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

Ответ 2

Вам также нужно обновить заголовок длины контента, иначе браузеры расстроятся (и 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

У меня была "ошибка обрыва трубы", обслуживающая статические файлы с ответом Питера Фармера, и проблемы с перенаправлением (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