Flask 缓存
当你的应用变慢的时候,可以考虑加入缓存。至少这是最简单的加速方法。缓存有什么用? 假设有一个函数耗时较长,但是这个函数在五分钟前返回的结果还是正确的。那么我们就 可以考虑把这个函数的结果在缓存中存放一段时间。
Flask 本身不提供缓存,但是它的基础库之一 Werkzeug 支持一些基本的缓存。
与创建 Flask 对象类似,创建一个缓存对象。可以创建一个SimpleCache对象。这个对象提供简单的缓存,它把缓存项目保存在 Python 解释器的内存中:
from werkzeug.contrib.cache import SimpleCache
cache = SimpleCache()
使用缓存:
现在的问题是如何使用缓存呢?有两个非常重要的操作: get() 和 set()。
get() 用于从缓存中获得项目,调用时使用 一个字符串作为键名。如果项目存在,那么就会返回这个项目,否则返回 None:
rv = cache.get('my-cache')
set() 用于把项目添加到缓存中。第一个参数 是键名,第二个参数是键值。还可以提供一个超时参数,当超过时间后项目会自动删除。
下面是一个完整的例子:
def get_my_cache():
cache_data = cache.get('my-cache')
if rv is None:
cache_data = calculate_value()
cache.set('my-cache', cache_data, timeout=5 * 60)
return rv
Werkzeug 自带缓存只能在比较小的项目中使用,所以我们商城项目中引入Flask-Cache第三方扩展。
Flask-Cache 缓存扩展
安装:
pip install flask-Cache
使用:
缓存(Cache)是通过使用一个 Cache 实例进行管理:
from flask import Flask
from flask.ext.cache import Cache
app = Flask(__name__)
#创建一个缓存实例 CACHE_TYPE 指定使用哪些类型的缓存对象
cache = Cache(app,config={'CACHE_TYPE': 'simple'})
使用redis作为缓存服务器
CACHE配置
CACHE_REDIS_HOST Redis服务器的主机。仅用于RedisCache。
CACHE_REDIS_PORT Redis服务器的端口。默认是6379。仅用于RedisCache。
CACHE_REDIS_PASSWORD 用于Redis服务器的密码。仅用于RedisCache。
CACHE_REDIS_DB Redis的db库 (基于零号索引)。默认是0。仅用于RedisCache。
CACHE_DIR 存储缓存的目录。仅用于FileSystemCache。
CACHE_REDIS_URL 连接到Redis服务器的URL。 例如:redis://user:password@localhost:6379/2。 仅用于RedisCache。
CACHE_KEY_PREFIX 所有键之前添加的前缀。
CACHE_DEFAULT_TIMEOUT 如果没有设置延迟时间,默认的延时时间会被使用。单位为秒。
CACHE_TYPE : 指定哪些类型的缓存对象来使用
可使用类型:
null: NullCache (default)
simple: SimpleCache #使用本地Python字典缓存。这不是真正的线程安全。
memcached: MemcachedCache (pylibmc or memcache required) #使用memcached服务器作为后端。
gaememcached: GAEMemcachedCache
redis: RedisCache (Werkzeug 0.7 required) #使用redis
filesystem: FileSystemCache # 文件系统
saslmemcached: SASLMemcachedCache (pylibmc required)
项目中使用 redis缓存:
from flask_cache import Cache
# 创建缓存对象
cache = Cache()
app = Flask(__name__) # type:Flask
cache.init_app(app,config={"CACHE_TYPE":'redis', "CACHE_REDIS_URL":'redis://%s:%s/2' % (REDIS_HOST, REDIS_PORT))
#缓存无动态参数的视图函数
@app.route('/')
@cache.cached(timeout=60)
def index():
return render_template('index.html')
# 缓存带动态参数的视图函数
# key_prefix 参数来进行定位, 而且该形参除了可以接受 String 类型对象之后, 也可以接收一个函数.
make_cache_key 函数可根据请求参数,生成唯一 key_prefix
@app.route('/post/<string:post_id>', methods=('GET', 'POST'))
@cache.cached(timeout=60, key_prefix=make_cache_key)
def post(post_id):
pass
# 缓存普通函数
# 装饰器 @ cache.cached() 的形参数 key_prefix 是必须的, 并且传入的值是唯一
@cache.cached(timeout=7200, key_prefix='kk')
def kk():
a,b=1,2
return a+b
# 缓存带参数的普通函数
# cache.cached() 不会考虑函数的参数,所以函数需要传参数使用 @cache.memoize()
@cache.memoize(1)
def test(id):
return id