有時候為了提高響應速度,可以考慮加入緩存。至少這是最簡單的加速方法。緩存有什么用?加入一個請求在一段時間內多次請求結果都是一樣的。 那么我們就可以考慮把這個函數的結果在緩存中存放一段時間。
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/)