如果你开启了一个flask应用运行很慢,建议尝试引入一些缓存。我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从数据库中查找。
下面介绍下如何引入缓存机制–Flask-Cache。
首先使用pip将其安装上:
pip install flask-cache
然后创建一个Flask-Cache的实例:
from flask import Flask
from flask_cache import Cache
# flask模块
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
我们可以用cache对象的”cached()”方法来装饰视图函数,以达到缓存视图的目的:
@app.route('/hello')
@app.route('/hello/<name>')
@cache.cached(timeout=300, key_prefix='view_%s', unless=None)
def hello(name=None):
print 'view hello called'
return render_template('hello.html', name=name)
cache.cached()装饰器有三个参数:
- timeout:过期时间,默认为None,即永不过期
- key_prefix:缓存项键值的前缀,默认为”view/%s”
- unless:回调函数,当其返回True时,缓存不起作用。默认为None,即缓存有效
除了装饰视图函数,”cache.cached()”装饰器也可以用来装饰普通函数:
@cache.cached(timeout=100, key_prefix='get_list')
def get_list():
print 'get_list_called'
return ['a','b','c','d','e']
@app.route('/list')
def list():
return ', '. join(get_list())
cache.memoize() 缓存函数中带有参数的函数
Flask-Cache还提供了另一个装饰器方法”cache.memoize()”,它与”cache.cached()”的区别就是它会将函数的参数也放在缓存项的键值中:
@cache.memoize(timeout=50)
def create_list(num):
print 'method create_list called'
l = []
for i in range(num):
l.append(str(i))
return l
@app.route('/list/<int:num>')
def list(num):
return ', '.join(create_list(num))
我们再次访问”/list”地址,对于不同的参数,”method called”会一直在控制台上打印出,而对于相同的参数,第二次就不会打印了。所以对于带参数的函数,你要使用”cache.memoize()”装饰器,而对于不带参数的函数,它同”cache.cached()”基本上一样。”cache.memoize()”装饰器也有三个参数,”timeout”和”unless”参数同”cache.cached()”一样,就是第二个参数”make_name”比较特别。它是一个回调函数,传入的是被装饰的函数名,返回是一个字符串,会被作为缓存项键值的一部分,如果不设,就直接使用函数名。
删除缓存
对于普通缓存,你可以使用”delete()”方法来删除缓存项,而对于”memoize”缓存,你需要使用”delete_memoized”方法。如果想清除所有缓存,可以使用”clear()”方法。
cache.delete('get_list') # 删除'get_list'缓存项
cache.delete_many('get_list', 'view_hello') # 同时删除'get_list'和'view_hello'缓存项
cache.delete_memoized('create_list', 5) # 删除调用'create_list'函数并且参数为5的缓存项
cache.clear() # 清理所有缓存**
总结:
cache.cached:装饰器,装饰无参数函数,使得该函数结果可以缓存
cache.memoize:装饰器,装饰有参数函数,使得该函数结果可以缓存
参考链接:https://blog.csdn.net/huang_yong_peng/article/details/82622077