组团学

flask扩展 flask-cache

阅读 (178863)

一、安装

pip install flask-cache

二、创建三方对象

from flask_cache import Cache
cache = Cache()

三、app加载三方对象

from exts import cache
cache.init_app(app)

四、配置

# 缓存类型 redis数据库 CACHE_TYPE = "redis" # CACHE_TYPE = "simple" # 简单的缓存 #缓存时间 CACHE_DEFAULT_TIMEOUT = 60 * 60 * 24 * 7 #redis中键的前缀 CACHE_KEY_PREFIX = "cache:" # redis地址 CACHE_REDIS_HOST = "127.0.0.1" # redis端口 CACHE_REDIS_PORT = 6379 # redis密码 CACHE_REDIS_PASSWORD = "123456" # 使用哪个库 CACHE_REDIS_DB = 1

五、启动报错与解决

  • 报错

image20200213200209398.png

  • 解决

    打开文件

    sudo vim /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_cache/jinja2ext.py

    修改文件

    33行原文件

    from flask.ext.cache import make_template_fragment_key

    修改为

    from flask_cache import make_template_fragment_key

六、使用

导入

from exts import cache
  • 装饰器缓存

    cache.cached()

    • timeout:过期时间,默认为None,即永不过期
    • key_prefix:缓存项键值的前缀,默认为”view/%s” 传入的值是唯一的
    • unless:回调函数,当其返回True时,缓存不起作用。默认为None,即缓存有效
    @myApp.route('/index/') @cache.cached(timeout=300) # @cache.cached(timeout=300,key_prefix='index')# 设置一个key_prefix来作为标记 def index(): return render_template("index.html")

    注意

    • cache.delete(‘index’) 前缀index来删除缓使用
    • 装饰器 cache.cached() 不会考虑到参数的问题, 如果函数在接收到不同的实参后依然返回相同结果

    cache.memoize()

    @myApp.route('/page/<int:num>/') @myApp.route('/page/') @cache.memoize(300) def con(num=1): return render_template("index.html")

    注意

    • 装饰器 @cache.memoize() 不仅仅会缓存运行的结果, 还缓存调用时的参数, 所以在函数接受到相同的参数时, 就会将缓存中该参数对应的结果返回
  • 底层缓存

    设置

    @myApp.route("/setCache/") def setCache(): key = request.args.get("key") value = request.args.get("value") #设置缓存(往redis中存储键值对) cache.set(key, value, 60) return "设置了一个键为%s,值为%s的缓存"%(key, value)

    获取

    @myApp.route("/getCache/") def getCache(): key = request.args.get("key") #获取缓存值,如果获取不到返回None value = cache.get(key) return "获取键为%s的缓存的值:%s"%(key, value)

    删除

    • 第一种方法就是设置过期时间自动清除,可以在 Flask 的config里面加上配置项:

      CACHE_DEFAULT_TIMEOUT

    • 装饰器加参数timeout=50。

      @cache.cached(timeout=50) @cache.memoize(timeout=50)
    • 清除所有缓存
      cache.clear()
    • 只清除 memoize的缓存

      cache.delete_memoized(缓存的视图函数名) #实例 cache.delete_memoized(con) cache.delete_memoized('con', 5) # 删除调用'con'函数并且参数为5的缓存项
    • 删除cache.cached的缓存

      cache.delete('con') # 删除'con'缓存项 cache.delete_many('con', 'view_hello') # 同时删除'con'和'view_hello'缓存项

    缓存案例

    @blue.route("/user/") def user(): addr = request.remote_addr key = addr + "user" # current_app result = cache.get(key) if result: print(addr, "从缓存中加载数据") return result result = render_template("User.html") print(addr, "从数据库加载数据") cache.set(key, result, timeout=30) return result
需要 登录 才可以提问哦