Flask кэшировать некоторые данные, но не все - PullRequest
0 голосов
/ 07 августа 2020

У меня есть функция, с помощью которой я пытаюсь рассчитать продолжительность выполнения. когда я использую кеш Flask, он не будет go в функции и не будет вычислять продолжительность.

@app.route('/', methods=['get'])
@cache.cached(timeout=60)
def request_process_duration():
    start = time.time()
    for i in range(5):
        time.sleep(1)
    duration = time.time() - start
    return jsonify(duration)

Результат этой функции был 5 в течение 60 секунд (тайм-аут кеширования). Я хочу чтобы получить результат 5 при первом запуске, а затем в течение следующих 60 секунд значительно снизить производительность.

1 Ответ

0 голосов
/ 07 августа 2020

когда я использую кеш 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.

Возможно, вы могли бы решить эту проблему, записав это значение в журнал или базу данных, если потребуется. Извините, это все, что мне известно по моим умениям :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...