1.安装Flask-Caching
进入到需要使用到该拓展的项目根目录,通过下面的命令安装。这个拓展是fork Flask-Cache
仓库进行修改的,由于Flask-Cache
已经年久失修了,所以这边推荐使用Flask-Caching
,在安装的时候不要装错了拓展名。
pip install flask-caching
2.简单的使用
使用一个简单的例子来说明cache的作用以及使用方法
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
@app.route('/no-cache/')
def no_cache():
time.sleep(1)
return '没有使用缓存页面'
@app.route('/cache/')
@cache.cached(timeout=10 * 60)
def cache_page():
time.sleep(1)
return '使用缓存页面'
if __name__ == '__main__':
app.run(debug=True)
启动应用,分别访问no-cache与cache页面,F12 打开控制台,查看两个页面的请求时间。
- 打开no-cache页面每次请求时间都要1s以上,因为在视图函数中进行了一秒的延时;
- 打开cache页面第一次也需要1s以上的时间,但第二次打开就只要毫秒级别的时间了,这就是flask-cache的作用,它将视图函数的结果缓存在字典中(因为使用的是simple方式),当请求过来时候直接去字典中取值然后返回响应;
3.更新缓存
当使用缓存之后,我们会遇到的一个问题,就是数据不会实时刷新,比如我这个博客,如果主页使用了缓存,那么当我新增了文章或者删除了文章,如果没有及时的更新缓存那么访问主页还是获取的原来的数据,因此在必要的时候,我们需要将对应的缓存进行更新。
在我的博客系统中,侧边栏的github
信息以及每日一句
都采用了缓存,核心代码如下所示
@blog_bp.route('/load-github/', methods=['POST'])
@cache.cached(timeout=5*60)
def load_github():
theme = request.form.get('theme')
star = rd.get('star')
if star is None:
star, fork, watcher, star_dark, fork_dark, watcher_dark, user_info, repo_info = github_social()
avatar = user_info.json()['avatar_url']
repo_desc = repo_info.json()['description']
# 获取浅色主题的shield
rd.set('star', star.text)
rd.set('fork', fork.text)
rd.set('watcher', watcher.text)
# 获取深色主题的shield
rd.set('star_dark', star_dark.text)
rd.set('fork_dark', fork_dark.text)
rd.set('watcher_dark', watcher_dark.text)
rd.set('avatar', avatar)
rd.set('repo_desc', repo_desc)
star = star.text
if theme == 'dark':
star = star_dark.text
else:
if theme == 'dark':
fork = rd.get('fork_dark')
watcher = rd.get('watcher_dark')
star = rd.get('star_dark')
else:
fork = rd.get('fork')
watcher = rd.get('watcher')
avatar = rd.get('avatar')
repo_desc = rd.get('repo_desc')
return jsonify({'star': star,
'fork': fork,
'watcher': watcher,
'avatar': avatar,
'repo_desc': repo_desc
})
@blog_bp.route('/load-one/', methods=['POST'])
@cache.cached(timeout=60*60)
def load_one():
one = rd.get('one')
# 防止服务器重启之后清空了redis数据导致前端获取不到当日one内容
if not one:
one = OneSentence.query.filter_by(day=datetime.date.today()).first()
return jsonify({'one': one.content})
return jsonify({'one': one})
在这两个请求的视图函数中,添加了caching的装饰器,每个视图的缓存时间为5分钟,在本地测试之后,感觉功能正常就部署到了生产环境中了。
我的博客有两套主题,一套是light另外一套是dark,其中github shield标签是会根据主题模式进行变化的,但是当我加上了缓存之后,发现切换主题模式之后github shield不会改变,如下所示
light主题dark主题
这是回过头来发现,是因为缓存的原因导致没有更新github shield
,于是在切换主题的视图函数中添加了清除缓存的代码,如下
@blog_bp.route('/themes/<string:theme_name>/')
def change_theme(theme_name):
if theme_name not in current_app.config['BLOG_THEMES'].keys():
abort(404)
cache.clear()
response = redirect(request.referrer)
response.set_cookie('blog_theme', current_app.config['BLOG_THEMES'].get(theme_name), max_age=30 * 24 * 60 * 60)
return response
上面的代码就是在切换主题的时候,清除了缓存信息,这样我们就会重新去获取对应主题的github shield
了。
所以在使用数据缓存的时候,我们需要时刻注意保持数据的最新状态。本篇文章就到此了,只是演示了一些简单的Flask-Caching
的应用,感兴趣的可以去查找相关文档或者教程进一步的学习。