共计 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
五、启动报错与解决
- 报错
-
解决
打开文件
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
-
正文完
星哥玩云-微信公众号