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::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',})

相关推荐