Flask-Cache的使用

本文介绍了如何在Flask应用中使用Flask-Cache实现缓存,包括安装、初始化、缓存视图函数、缓存其他函数、memoize方法、清除缓存以及各种缓存后端的配置选项。通过示例代码详细阐述了缓存的使用方法和配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

安装

pip install flask-cache

初始化

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

from flask import Flask
from flask_cache import Cache

app = Flask(__name__)
cache = Cache(app,config={
    "CACHE_TYPE":"simple"
})

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

app = Flask(__name__)
cache = Cache(config={
    "CACHE_TYPE":"simple"
})
cache.init_app(app)

或者也可以这样:

app = Flask(__name__)
cache = Cache()
cache.init_app(app,config={
    "CACHE_TYPE":"simple"
})

缓存视图函数

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

@app.route("/get_info")
@cache.cached()
def get_info():
    print "no cache"
    return "it is ok!"

@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)

memoize()

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

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

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

清除缓存

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

from manager import app,cache

with app.app_context():
    cache.clear()

配置

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_HOSTredis地址
CACHE_REDIS_PORTredis端口
CACHE_REDIS_PASSWORDredis密码
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 Cache

app = 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()
  • 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可选字典在缓存类实例化期间传递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值