当一个资源需要从服务器中获取,并且资源比较庞大,服务器可能处理起来比较慢,并且此功能为热门功能,可能用户需要经常访问获取。此时,服务器就可以考虑缓存技术。缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。接下来将记录一下如何缓存一个Flask的请求,并且记录一下Flask的缓存扩展库Flask-Cache

安装

pip install flask-cache
  • 1

初始化

当我们安装好了Flask-Cache模块时,我们还需要对其进行实例化,并进行相应的配置:

from flask import Flask
from flask_cache import Cacheapp = Flask(__name__)
cache = Cache(app,config={"CACHE_TYPE":"simple"
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

也可以使用init_app()方法稍后设置你的实例:

app = Flask(__name__)
cache = Cache(config={"CACHE_TYPE":"simple"
})
cache.init_app(app)
  • 1
  • 2
  • 3
  • 4
  • 5

或者也可以这样:

app = Flask(__name__)
cache = Cache()
cache.init_app(app,config={"CACHE_TYPE":"simple"
})
  • 1
  • 2
  • 3
  • 4
  • 5

缓存视图函数

要缓存视图函数,你可以使用@cache.cached()装饰器,这个装饰器默认使用request.path作为cache_key:

@app.route("/get_info")
@cache.cached()
def get_info():print "no cache"return "it is ok!"
  • 1
  • 2
  • 3
  • 4
  • 5

@cache.cached()装饰器还可以接收参数,如参数timeout设置缓存过期时间;参数unless接收一个Bool类型的值,如果设置为True将不会使用缓存机制;参数key_prefix替换默认的cache_key

缓存其他函数

使用@cache.cached()装饰器可以缓存其它非视图相关函数的结果,当使用@cache.cached()装饰器缓存非视图相关函数的结果时,建议传入参数key_prefix来替换默认的cache_key,否则它将会默认使用request.path作为cache_key:

@cache.cached(timeout=30,key_prefix="aaa")
def sum_data(a,b):return int(a) + int(b)
  • 1
  • 2
  • 3

memoize()

@cache.memoize()装饰器中,函数的参数也包含在cache_key中:

@cache.memoize(timeout=30)
def sum_data(a,b):return int(a) + int(b)
  • 1
  • 2
  • 3

值得注意的是,对于不接收参数的函数来说,@cache.memoize()@cache.cached()是一样的

清除缓存

以下是一个用于清除应用程序缓存的示例脚本:

from manager import app,cachewith app.app_context():cache.clear()
  • 1
  • 2
  • 3
  • 4

配置

Flask-Cache支持多个类型作为缓存后端,不同的缓存后端,配置项也不尽相同,接下来记录一下Flask-Cache支持的缓存后端:

  • null:无缓存。相关配置项如下:
配置 说明
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

simple:使用本地python字典进行存储,这不是线程安全的。相关配置项如下:

配置 说明
CACHE_DEFAULT_TIMEOUT 默认过期/超时时间,单位为秒
CACHE_THRESHOLD 缓存的最大条目数
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

filesystem:使用文件系统来存储缓存的值。相关配置项如下:

配置 说明
CACHE_DEFAULT_TIMEOUT 默认过期/超时时间,单位为秒
CACHE_DIR 存储缓存的目录
CACHE_THRESHOLD 缓存的最大条目数
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

memcached:使用memcached服务器作为缓存后端,支持pylibmcmemcache或Google应用程序引擎memcache库。相关配置项如下:

配置 说明
CACHE_DEFAULT_TIMEOUT 默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX 设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS 服务器地址的列表或元组
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

redis:使用Redis作为缓存后端。相关配置项如下:

配置 说明
CACHE_DEFAULT_TIMEOUT 默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX 设置cache_key的前缀
CACHE_REDIS_HOST redis地址
CACHE_REDIS_PORT redis端口
CACHE_REDIS_PASSWORD redis密码
CACHE_REDIS_DB 使用哪个库
CACHE_REDIS_URL 连接到Redis服务器的URL。示例redis://user:password@localhost:6379/2
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

举个栗子:

from flask import Flask
from flask_cache improt Cacheapp = Flask(__name__)
cache = Cache(app,config={"CACHE_TYPE":"redis","CACHE_REDIS_HOST":"192.168.0.158","CACHE_REDIS_PORT":6379,"CACHE_REDIS_PASSWORD":"123456","CACHE_REDIS_DB":2
})@app.route("/get_info")
@cache.cached(timeout=30)
def get_info():print "no cache!"return "it is ok!"if __name__ == "__main__":app.run()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • saslmemcached:使用memcached服务器作为缓存后端,打算与支持SASL的连接一起使用到memcached服务器。pylibmc是必须的,SASL必须由libmemcached支持。相关配置项如下:
配置 说明
CACHE_DEFAULT_TIMEOUT 默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX 设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS 服务器地址的列表或元组
CACHE_MEMCACHED_USERNAME 使用memcached进行SASL认证的用户名
CACHE_MEMCACHED_PASSWORD 使用memcached进行SASL认证的密码
CACHE_ARGS 在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS 可选字典在缓存类实例化期间传递

Flask-Cache的使用相关推荐

  1. flask cache

    测试代码: import time from flask.ext.cache import Cache from flask import Flaskapp = Flask(__name__) app ...

  2. flask中的所有第三方模块大集合

    关于flask你想要的这里都有!!! Flask-AppBuilder - Simple and rapid Application builder, includes detailed securi ...

  3. from flask.ext.cache import make_template_fragment_key

    d:\ProgramData\Anaconda3\envs\FlaskPath\lib\site-packages\flask_cache\jinja2ext .py 找到该文件,将from flas ...

  4. flask 使用cache时 报错 No module named 'flask.ext'

  5. CentOS 部署 flask项目

    原文地址 最近在学习 python,使用 flask 实现了个个人博客程序,完了想部署到服务器上.因为是新手,一路磕磕绊绊最终把它基本搞定.网上资料对新手感觉都不太友好,都是零零碎碎的,所以我整理了一 ...

  6. web框架总结(django、flask)

    1.MVC解读 M:Model,模型,和数据库进行交互 V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答. 1.用户点击注 2 ...

  7. 22.executor service Flask

    pip包管理器 没有npm那么强大 不支持 npm --save install 这样的方法 但是我们有别的方法 安装Flask 但是呢 我们不能把它存放在package .json 那就需要我们自己 ...

  8. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

  9. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

  10. 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 Mo ...

最新文章

  1. 预测 motif 的计算原理
  2. wkhtmltopdf
  3. SQLSERVER数据库日志文件过大,如何压缩并定期清理 ?
  4. java卸载_java快速入门篇之windows-MySQL-5.6安装与卸载
  5. filebeat+elk简单搭配
  6. html 模板中的for循环,Flask模板引擎中的For循环
  7. vuepc端实现数据加载_多模态注意力机制+多模态数据,完全实现端到端课堂活动检测|ICASSP 2020...
  8. stm32 SPI架构
  9. 英寸和厘米的交互python_Python的新手-尝试将厘米编码为英寸,反之亦然
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的疫情防控物业管理系统
  11. 古代的酒到底多少度,为何古人动不动喝好几坛都不会醉呢?
  12. TypeError: '
  13. 在fc6上安装myeclipse全程记录
  14. 架构设计说明书该怎么写?
  15. 两阶段随机规划模型简介
  16. 软件测试————第二章
  17. css 剪辑图片_css如何截取图片?
  18. c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序
  19. What are default and maximum values of dev_loss_tmo in Red Hat Enterprise Linux 6
  20. 智力题库软件测试,最新软件测试笔试题网友回忆版

热门文章

  1. 2020CCPC(威海) - Clock Master(数论+分组背包)
  2. 洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)
  3. CodeForces - 1344D Monopole Magnets(dfs)
  4. CodeForces - 1332D Walk on Matrix(构造)
  5. HDU - 1542 Atlantis(线段树+扫描线)
  6. php中如何固定表格宽度,实例讲解DataTables固定表格宽度(设置横向滚动条)
  7. HDU3400(计算几何中的三分法利用)
  8. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----SYN(洪水攻击)篇
  9. C++设计模式之访问者模式
  10. C++开发中的pImpl方法