展开

文章目录

修改历史

历史修改版本

  1. 2021-04-30 12:26:38

Flask-Caching的简单应用

2021-04-26 18:56:34 Python 187

简介

在日常的开发工作中,缓存这个名词耳熟能详。在django框架中有内置的cache系统,Flask作为一个微框架,是没有内置cache系统,不过我们可以通过Flask-Caching这个第三方拓展来做缓存。

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的应用,感兴趣的可以去查找相关文档或者教程进一步的学习。

当前共有0条评论