flask-caching
Posted liuweida
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask-caching相关的知识,希望对你有一定的参考价值。
作用:用于缓存
官网
https://pythonhosted.org/Flask-Cache/
安装
pip install Flask-Cache 或 pip install Flask-Caching
配置(三种方式)
第一种
from flask import Flask from flask_caching import Cache app = Flask(__name__) # Check Configuring Flask-Caching section for more details cache = Cache(app, config={'CACHE_TYPE': 'simple'})
第二种
cache = Cache(config={'CACHE_TYPE': 'simple'}) app = Flask(__name__) cache.init_app(app)
第三种
#: Method A: During instantiation of class cache = Cache(config={'CACHE_TYPE': 'simple'}) #: Method B: During init_app call cache.init_app(app, config={'CACHE_TYPE': 'simple'})
配置多个缓存实例
如果有多个缓存需要使用不同的缓存后端,则可以备用多个字典;
cache1 = Cache() cache2 = Cache() cache1.init_app(app, config={ 'CACHE_TYPE' : 'redis','CACHE_REDIS_HOST':'192.168.1.20', 'CACHE_REDIS_PORT':'6390'}) cache2.init_app(app, config={ 'CACHE_TYPE' : 'redis','CACHE_REDIS_HOST':'192.168.1.21', 'CACHE_REDIS_PORT':'6390'})
其他配置操作
CACHE_TPYE null: 无缓存 simple: 本地Python字典存储 memcached: 使用MemcachedCache作为缓存 gaememcached: 使用GAEMemcachedCache作为缓存 redis: 使用RedisCache作为存储 filesystem: 使用FileSystemCache作为缓存 saslmemcached: 使用SASLMemcachedCache作为缓存 RedisCache – redis配置 CACHE_DEFAULT_TIMEOUT 超时时间 CACHE_KEY_PREFIX cache_key前缀(key-value) CACHE_REDIS_HOST Redis服务器主机 CACHE_REDIS_PORT Redis服务器端口。默认值为6379 CACHE_REDIS_PASSWORD Redis服务器密码 CACHE_REDIS_DB Redis db(从零开始的数字索引)。默认值为0 CACHE_REDIS_URL 连接到Redis服务器的URL(redis://user:password@host:port/db) CACHE_ARGS 缓存时传递的参数列表 CACHE_OPTIONS 选项(传递参数的作用)
视图中使用
# 缓存视图函数 @blue.route('/home/') @cache.cached(timeout=30) def home(): pass cache.cached:装饰器,装饰无参数函数,使得该函数结果可以缓存 参数: timeout:超时时间 key_prefix:设置该函数的标志 unless:设置是否启用缓存,如果为True,不启用缓存 forced_update:设置缓存是否实时更新,如果为True,无论是否过期都将更新缓存 query_string:为True时,缓存键是先将参数排序然后哈希的结果 cache.memoize:装饰器,装饰有参数函数,使得该函数结果可以缓存 make_name:设置函数的标志,如果没有就使用装饰的函数 # 其他参数同cached cache.delete_memoized:删除缓存 参数: fname:缓存函数的名字或引用 *args:函数参数 cache.clear() # 清除缓存所有的缓存,这个操作需要慎重 cache.cache # 获取缓存对象
模板中使用
上面介绍的缓存功能都是在应用代码中使用,其实在Jinja2模板中,我们还可以使用
{% cache %}
语句来缓存模板代码块:{% cache 50, 'temp' %} <p>This is under cache</p> {% endcache %}
这样
{% cache %}
和{% endcache %}
语句中所包括的内容就会被缓存起来。{% cache %}
语句的第一个参数是timeout
过期时间,默认为永不过期;第二个参数指定了缓存项的键值,如果不设,键值就是模板文件路径"+"缓存块的第一行
。上例中,我们设了键值是temp
,然后在代码中,我们可以这样获取缓存项实际的键值:from flask.ext.cache import make_template_fragment_key key = make_template_fragment_key('temp') # 获取实际的键值 cache.delete(key) # 使用实际键值删除缓存
打印出来看看,你会发现实际的键值其实是
_template_fragment_cache_temp
。如果你要删除该缓存项,记得要传入实际的键值,而不是模板上定义的temp
。其他使用
cache.set('name', 'atom', timeout=60) # 设置缓存 name = cache.get('name') # 取值 cache.clear() # 清空缓存 cache.delete(‘index’) # 删除缓存
所有类型的缓存对象都继承自flask框架的BaseCache,它定义了一个使用缓存的标准接口,通过继承BaseCache实现这些接口就可以在flask中方便的集成各种缓存;而flask_caching插件为我们对redis、memcached等实现了接口,做好了适配工作,我们可以直接使用。
from werkzeug.contrib.cache import BaseCache # 标准接口 clear():清除缓存 get(key):获取一个键的值,如果值是json格式会自动转化成字典 set(key,value,timeout):设置一个键值,value可以是字典,会自动转化json格式的字符串 set_many(key,value,timeout):设置多个键值对 add(key, value, timeout=None):设置一个键值,如果存在就pass,注意和set的区别 delete(key):删除键 delete_many(k1,k2...):删除多个键值 get_many(k1,k2...):获取多个键的值 get_dict(k1,k2...):获取多个键的值,返回一个字典 has(k):查询是否存在一个键 inc(self, key, delta=1):将键的值加一 dec(self, key, delta=1):将键的值减一
自定义缓存后端
#: the_app/custom.py class RedisCache(BaseCache): def __init__(self, servers, default_timeout=500): pass # 实现BaseCache的各个接口 def redis(app, config, args, kwargs): args.append(app.config['REDIS_SERVERS']) return RedisCache(*args, **kwargs) # CACHE_TYPE 就是 the_app.custom.redis from the_app.custom import redis cache.init_app(app, config={ 'CACHE_TYPE' : 'redis',})
以上是关于flask-caching的主要内容,如果未能解决你的问题,请参考以下文章
用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速
python memoize / cache decorators(另请参阅https://pythonhosted.org/Flask-Cache/#flask.ext.cache.Cache.me