Flask 缓存

当你的应用变慢的时候,可以考虑加入缓存。至少这是最简单的加速方法。缓存有什么用? 假设有一个函数耗时较长,但是这个函数在五分钟前返回的结果还是正确的。那么我们就 可以考虑把这个函数的结果在缓存中存放一段时间。

Flask 本身不提供缓存,但是它的基础库之一 Werkzeug 支持一些基本的缓存。

与创建 Flask 对象类似,创建一个缓存对象。可以创建一个SimpleCache对象。这个对象提供简单的缓存,它把缓存项目保存在 Python 解释器的内存中:

from werkzeug.contrib.cache import SimpleCache
cache = SimpleCache()

使用缓存:

现在的问题是如何使用缓存呢?有两个非常重要的操作: get() 和 set()。

get() 用于从缓存中获得项目,调用时使用 一个字符串作为键名。如果项目存在,那么就会返回这个项目,否则返回 None:

rv = cache.get('my-cache')

set() 用于把项目添加到缓存中。第一个参数 是键名,第二个参数是键值。还可以提供一个超时参数,当超过时间后项目会自动删除。

下面是一个完整的例子:

def get_my_cache():
    cache_data = cache.get('my-cache')
    if rv is None:
        cache_data = calculate_value()
        cache.set('my-cache', cache_data, timeout=5 * 60)
    return rv

Werkzeug 自带缓存只能在比较小的项目中使用,所以我们商城项目中引入Flask-Cache第三方扩展。

Flask-Cache 缓存扩展

安装:

pip install flask-Cache

使用:

缓存(Cache)是通过使用一个 Cache 实例进行管理:

from flask import Flask
from flask.ext.cache import Cache

app = Flask(__name__)

#创建一个缓存实例 CACHE_TYPE 指定使用哪些类型的缓存对象
cache = Cache(app,config={'CACHE_TYPE': 'simple'})

使用redis作为缓存服务器

CACHE配置

CACHE_REDIS_HOST    Redis服务器的主机。仅用于RedisCache。
CACHE_REDIS_PORT    Redis服务器的端口。默认是6379。仅用于RedisCache。
CACHE_REDIS_PASSWORD    用于Redis服务器的密码。仅用于RedisCache。
CACHE_REDIS_DB    Redis的db库 (基于零号索引)。默认是0。仅用于RedisCache。
CACHE_DIR    存储缓存的目录。仅用于FileSystemCache。
CACHE_REDIS_URL    连接到Redis服务器的URL。 例如:redis://user:password@localhost:6379/2。 仅用于RedisCache。
CACHE_KEY_PREFIX 所有键之前添加的前缀。
CACHE_DEFAULT_TIMEOUT     如果没有设置延迟时间,默认的延时时间会被使用。单位为秒。



CACHE_TYPE :     指定哪些类型的缓存对象来使用 
可使用类型:
null: NullCache (default)
simple: SimpleCache   #使用本地Python字典缓存。这不是真正的线程安全。
memcached: MemcachedCache (pylibmc or memcache required) #使用memcached服务器作为后端。
gaememcached: GAEMemcachedCache
redis: RedisCache (Werkzeug 0.7 required) #使用redis
filesystem: FileSystemCache  # 文件系统
saslmemcached: SASLMemcachedCache (pylibmc required)

项目中使用 redis缓存:

from flask_cache import Cache
# 创建缓存对象
cache = Cache()
app = Flask(__name__)  # type:Flask
cache.init_app(app,config={"CACHE_TYPE":'redis', "CACHE_REDIS_URL":'redis://%s:%s/2' % (REDIS_HOST, REDIS_PORT))


#缓存无动态参数的视图函数
@app.route('/')
@cache.cached(timeout=60)
def index():
     return render_template('index.html')


# 缓存带动态参数的视图函数

# key_prefix 参数来进行定位, 而且该形参除了可以接受 String 类型对象之后, 也可以接收一个函数.
make_cache_key  函数可根据请求参数,生成唯一 key_prefix

@app.route('/post/<string:post_id>', methods=('GET', 'POST'))
@cache.cached(timeout=60, key_prefix=make_cache_key)
def post(post_id):
    pass

# 缓存普通函数
# 装饰器 @ cache.cached() 的形参数 key_prefix 是必须的, 并且传入的值是唯一
@cache.cached(timeout=7200, key_prefix='kk')
def kk():
    a,b=1,2
    return a+b

# 缓存带参数的普通函数
# cache.cached() 不会考虑函数的参数,所以函数需要传参数使用 @cache.memoize()
@cache.memoize(1)
def test(id):
    return id
Iyoyo电子书 一本集作者多年开发经验的python电子书 all right reserved,powered by Gitbook文件修订时间: 2022年 09:58:43