flask插件之使用flask_caching缓存

2022-08-05 20:59:50 浏览数 (1)

安装

代码语言:javascript复制
pip install Flask-Caching

配置

exts.py

代码语言:javascript复制
from flask_caching import Cache

# 缓存
cache = Cache()

__init__.py

代码语言:javascript复制
from exts import db, cache
cache.init_app(app)

config.py

代码语言:javascript复制
# 缓存类型及目录
CACHE_TYPE = 'filesystem'
CACHE_DIR = "./cache/"

view.py

代码语言:javascript复制
#要缓存视图函数,你可以使用@cache.cached()装饰器,这个装饰器默认使用request.path作为cache_key:
# 首页
@app.route('/')
@cache.cached(timeout=60)
def index_html():
    title = '首页'
    return render_template('index.html', **locals())
缓存其他函数

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

代码语言:javascript复制
@cache.cached(timeout=30,key_prefix="abc")
def sum_data(a,b):
memoize()

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

代码语言:javascript复制
@cache.memoize(timeout=30)
def sum_data(a,b):

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

常用配置参数详解

代码语言:javascript复制
CACHE_TYPE:设置缓存的类型

# 下面五个参数是所有的类型共有的
CACHE_NO_NULL_WARNING = "warning" # null类型时的警告消息
CACHE_ARGS = []    # 在缓存类实例化过程中解包和传递的可选列表,用来配置相关后端的额外的参数
CACHE_OPTIONS = {}    # 可选字典,在缓存类实例化期间传递,也是用来配置相关后端的额外的键值对参数
CACHE_DEFAULT_TIMEOUT # 默认过期/超时时间,单位为秒
CACHE_THRESHOLD    # 缓存的最大条目数

CACHE_TYPE = null # 默认的缓存类型,无缓存
CACHE_TYPE = 'simple' # 使用本地python字典进行存储,线程非安全

CACHE_TYPE = 'filesystem' # 使用文件系统来存储缓存的值
CACHE_DIR = "" # 文件目录

CACHE_TYPE = 'memcached' # 使用memcached服务器缓存
CACHE_KEY_PREFIX # 设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS    # 服务器地址的列表或元组
CACHE_MEMCACHED_USERNAME # 用户名
CACHE_MEMCACHED_PASSWORD # 密码

CACHE_TYPE = 'uwsgi' # 使用uwsgi服务器作为缓存
CACHE_UWSGI_NAME # 要连接的uwsgi缓存实例的名称

CACHE_TYPE = 'redis' # 使用redis作为缓存
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

配置多个缓存实例

如果有多个缓存需要使用不同的缓存后端,则可以备用多个字典;

代码语言:javascript复制
cache1 = Cache()
cache2 = Cache()
cache1.init_app(app, config={ 'CACHE_TYPE' : 'redis','CACHE_REDIS_HOST':'192.168.1.20',
                             'CACHE_REDIS_PORT':'6390'})
cache2.init_app(app, config={ 'CACHE_TYPE' : 'redis','CACHE_REDIS_HOST':'192.168.1.21',
                             'CACHE_REDIS_PORT':'6390'})

Cache对象

Cache作为缓存对象,主要有三个参数:

代码语言:javascript复制
app:app对象
with_jinja2_ext:是否支持jinja2语法,默认True
config:配置参数

主要方法

代码语言:javascript复制
cache.cached:装饰器,装饰无参数函数,使得该函数结果可以缓存
参数:
timeout:超时时间
key_prefix:设置该函数的标志
unless:设置是否启用缓存,如果为True,不启用缓存
forced_update:设置缓存是否实时更新,如果为True,无论是否过期都将更新缓存
query_string:为True时,缓存键是先将参数排序然后哈希的结果

cache.memoize:装饰器,装饰有参数函数,使得该函数结果可以缓存
make_name:设置函数的标志,如果没有就使用装饰的函数
# 其他参数同cached

cache.delete_memoized:删除缓存
参数:
fname:缓存函数的名字或引用
*args:函数参数

cache.clear() # 清除缓存所有的缓存,这个操作需要慎重
cache.cache # 获取缓存对象

#获取某个网页是否存在缓存,key值如'view//gbook.html'
cache.cache.has('view/{}'.format(request.path))
#打印该缓存
print(request.path,cache.get('view/{}'.format(request.path)))
#删除该缓存
cache.delete('view//gbook.html')

BaseCache对象

所有类型的缓存对象都继承自flask框架的BaseCache,它定义了一个使用缓存的标准接口,通过继承BaseCache实现这些接口就可以在flask中方便的集成各种缓存;而flask_caching插件为我们对redis、memcached等实现了接口,做好了适配工作,我们可以直接使用。

代码语言:javascript复制
from werkzeug.contrib.cache import BaseCache

标准接口

代码语言:javascript复制
clear():清除缓存
get(key):获取一个键的值,如果值是json格式会自动转化成字典
set(key,value,timeout):设置一个键值,value可以是字典,会自动转化json格式的字符串
set_many(key,value,timeout):设置多个键值对
add(key, value, timeout=None):设置一个键值,如果存在就pass,注意和set的区别
delete(key):删除键
delete_many(k1,k2...):删除多个键值
get_many(k1,k2...):获取多个键的值
get_dict(k1,k2...):获取多个键的值,返回一个字典
has(k):查询是否存在一个键
inc(self, key, delta=1):将键的值加一
dec(self, key, delta=1):将键的值减一

参考文档

https://pythonhosted.org/Flask-Caching/#

0 人点赞