когда я использую кеш Flask, он не будет go в функции и не будет вычислять продолжительность.
Как вы уже понимаете, это потому, что кэшируется только возвращаемое значение этой функции.
Одним из подходов к решению этой проблемы может быть создание собственного декоратора для синхронизации функции.
Итак, инициализируйте приложение и настройте кеш:
from flask import Flask, jsonify
import time
app = Flask(__name__)
from flask_caching import Cache
config = {
"DEBUG": True, # some Flask specific configs
"CACHE_TYPE": "simple", # Flask-Caching related configs
"CACHE_DEFAULT_TIMEOUT": 300
}
app.config.from_mapping(config)
cache = Cache(app)
Затем определите декоратор. Этот напечатает результат за секунды:
def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
print ((te-ts), 'seconds')
return result
return timed
Наконец, украсьте функцию, которую вы sh вовремя. Строки декоратора должны быть размещены в следующем порядке:
@app.route('/', methods=['get'])
@timeit
@cache.cached(timeout=60)
def request_process_duration():
for i in range(5):
time.sleep(1)
return {'status':'success'}
При тестировании с двумя последующими запросами это дает вывод на консоли сервера:
4.977460145950317 seconds
172.17.0.1 - - [07/Aug/2020 14:57:04] "GET / HTTP/1.1" 200 -
0.00011014938354492188 seconds
172.17.0.1 - - [07/Aug/2020 14:57:05] "GET / HTTP/1.1" 200 -
Единственная проблема с этим подходом в том, что вычисленное время доступно только в самом декораторе. Я искал, как передать это обратно в декорированную функцию , которая, похоже, не помогает, потому что время окончания вычисляется после того, как возвращаемое значение method
присваивается result
.
Возможно, вы могли бы решить эту проблему, записав это значение в журнал или базу данных, если потребуется. Извините, это все, что мне известно по моим умениям :)