【问题标题】:Flask cache some data but not allFlask缓存一些数据但不是全部
【发布时间】:2020-11-27 16:58:56
【问题描述】:

我有一个函数,我正在尝试计算运行持续时间。 当我使用 Flask 缓存时,它不会进入函数,也不会计算持续时间。

@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 秒内输出低得多。

【问题讨论】:

    标签: python python-3.x flask flask-cache


    【解决方案1】:

    当我使用 Flask 缓存时,它不会进入函数,也不会计算持续时间。

    正如您可能已经理解的那样,这是因为只有该函数的返回值被缓存。

    解决这个问题的一种方法可能是创建自己的装饰器来为函数计时。

    所以初始化应用,并配置缓存:

    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
    

    最后装饰你想要计时的功能。装饰线必须按以下顺序放置:

    @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 -
    

    这种方法的唯一问题是计算出的时间仅在装饰器本身内可用。我搜索了如何传递这个back to the decorated function,这似乎没有帮助,因为结束时间是在method 的返回值分配给result 之后计算的。

    如果需要,也许您可​​以通过将该值写入日志或数据库来解决此问题。抱歉,这只是我的技能:)

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2014-02-12
      • 2021-10-06
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多