有时候为了提高响应速度,可以考虑加入缓存。至少这是最简单的加速方法。缓存有什么用?加入一个请求在一段时间内多次请求结果都是一样的。 那么我们就可以考虑把这个函数的结果在缓存中存放一段时间。
Flask 本身不提供缓存,但是 Flask-Caching 扩展可以。 Flask-Caching 支持多种后端,甚至可以支持你自己开发的后端。
内置常用缓存类型
* **null**: 不缓存 (default)
* **simple**: 简单缓存
* **filesystem**: 文件系统缓存
* **redis**: Redis缓存 (redis required)
* **redissentinel**: RedisSentinelCache -> Redis哨兵模式缓存 (redis required)
* **rediscluster**: RedisClusterCache -> Redis集群模式缓存(redis required)
* **uwsgi**: UWSGI缓存 (uwsgi required)
* **memcached**: Memcached缓存 (pylibmc or memcache required)
* **gaememcached**: same as memcached (for backwards compatibility)
* **saslmemcached**: SASLMemcachedCache (pylibmc required)
* **spreadsaslmemcached**: SpreadSASLMemcachedCache (pylibmc required)
我们以 redis 缓存为例
```
(.venv) root@airvip:~/python_app/flask-demo# pip install redis
(.venv) root@airvip:~/python_app/flask-demo# pip install Flask-Caching
```
修改配置文件 `config.py`
```
class Config(object):
SECRET_KEY = "AIRVip123456airvip"
# 数据库
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3307/jdbc1"
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = True
# cache
CACHE_TYPE = "redis"
CACHE_DEFAULT_TIMEOUT = 7200
CACHE_KEY_PREFIX = 'fl_'
CACHE_REDIS_HOST = "127.0.0.1"
CACHE_REDIS_PORT = 6379
CACHE_REDIS_DB = 1
```
对 `app` 目录下的 ` __init__` 初始化文件进行如下改造,添加 `cache` 模块
```
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_caching import Cache
import logging
from logging.handlers import RotatingFileHandler
from config import config_map
from app.utils.commons import ReCoverter
# 创建数据库对象
db = SQLAlchemy()
# 创建 cache 对象
cache = Cache()
##日志配置省略##
# 工厂模式
def create_app(config_name):
app = Flask(__name__)
# 设置 flask 的配置信息
config_class = config_map[config_name]
app.config.from_object(config_class)
# 使用 app 初始化 db
db.init_app(app)
# 使用 app 初始化 cache
cache.init_app(app)
##省略##
return app
```
在控制器方法中使用缓存
```
@bp.route('/cache1')
def cache1():
username = 'airvip'
cache.set("username", username, timeout=30)
print(cache.get('username'))
return 'ok \n'
@bp.route('/cache2')
@cache.cached(timeout=50)
def cache2():
return "你好 \n", 200, {"Content-Type": "application/text"}
```
传送门:[缓存更多使用技巧](https://flask-caching.readthedocs.io/en/latest/)