阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

flask扩展 flask-cache

137次阅读
没有评论

共计 2188 个字符,预计需要花费 6 分钟才能阅读完成。

一、安装

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

五、启动报错与解决

  • 报错

flask 扩展 flask-cache

  • 解决

    打开文件

    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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-05-26发表,共计2188字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中