Flask 缓存一些数据但不是全部
Flask cache some data but not all
我有一个函数正在尝试计算 运行 持续时间。
当我使用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 秒中获得更低的输出。
when I use the Flask cache, it won't go into the function and won't calculate the duration.
正如您可能已经理解的那样,这是因为仅缓存了该函数的 return 值。
解决此问题的一种方法可能是创建您自己的装饰器来为函数计时。
所以初始化应用程序,并配置缓存:
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
的 return 值分配给 result
之后计算的。
如果需要,也许您可以通过将该值写入日志或数据库来解决此问题。抱歉,这就是我的技能所及:)
我有一个函数正在尝试计算 运行 持续时间。 当我使用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 秒中获得更低的输出。
when I use the Flask cache, it won't go into the function and won't calculate the duration.
正如您可能已经理解的那样,这是因为仅缓存了该函数的 return 值。
解决此问题的一种方法可能是创建您自己的装饰器来为函数计时。
所以初始化应用程序,并配置缓存:
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
的 return 值分配给 result
之后计算的。
如果需要,也许您可以通过将该值写入日志或数据库来解决此问题。抱歉,这就是我的技能所及:)