Flask 扩展: 使用 Flask-Redis 连接 Redis

Flask-Redis 是基于 redis.py 的一个扩展, 用来连接 Redis 数据库, 整个扩展只有 56 行代码, 使用起来十分方便.

安装

1
pip install flask-redis

初始化

1
2
3
4
5
6
from flask import Flask
from flask_redis import FlaskRedis

app = Flask(__name__)
app.config['REDIS_URL'] = 'redis://:password@localhost:6379/0'
redis_client = FlaskRedis(app)

整个 Flask-Redis 只有 REDIS_URL 这一个配置用来连接 Redis 服务器. redis_client 就是 redis 对象, 使用它调用相应的方法就可以. 具体可调用的方法可以参考 Redis.py 文档.

使用示例

1
2
3
@app.route('/')
def index():
    return redis_client.get('potato')

源码

初始化方法

使用 FlaskRedis 创建 redis 实例的时候有一些参数是默认的, 下面是初始化方法:

1
2
3
4
5
6
7
8
9
class FlaskRedis(object):
    def __init__(self, app=None, strict=True, config_prefix="REDIS", **kwargs):
        self._redis_client = None
        self.provider_class = redis.StrictRedis if strict else redis.Redis
        self.provider_kwargs = kwargs
        self.config_prefix = config_prefix

        if app is not None:
            self.init_app(app)

可以看到默认实例使用的是 redis.StrictRedis 类, 并使用 kwargs 提供的参数进行初始化. StrictRedis 实现了 Redis 官方提供的命令, 即方法名与 redis-cli 使用方式一致. config_prefix 即配置文件中 REDIS_URl 中的 REDIS, 如果想要使用其他, 只需要更换这个值就可以了.

init_app 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
def init_app(self, app, **kwargs):
    redis_url = app.config.get(
        "{0}_URL".format(self.config_prefix), "redis://localhost:6379/0"
    )

    self.provider_kwargs.update(kwargs)
    self._redis_client = self.provider_class.from_url(
        redis_url, **self.provider_kwargs
    )

    if not hasattr(app, "extensions"):
        app.extensions = {}
    app.extensions[self.config_prefix.lower()] = self

init_app 方法通过 config_prefix 参数从配置文件获取参数作为 redis_url, 然后调用 provider_class 类的 from_url 方法对 redis 实例进行初始化.

使用自定义类

1
2
3
4
5
6
7
8
9
10
11
12
@classmethod
def from_custom_provider(cls, provider, app=None, **kwargs):
    assert provider is not None, "your custom provider is None, come on"

    # We never pass the app parameter here, so we can call init_app
    # ourselves later, after the provider class has been set
    instance = cls(**kwargs)

    instance.provider_class = provider
    if app is not None:
        instance.init_app(app)
    return instance

Flask-Redis 提供类方法连接自定义的类, 主要通过将 provider_class 实例属性设置为自定义类, 然后调用 init_app 方法, 该方法又调用自定义类的 from_url 对创建实例, 所以自定义类必须要有 from_url 方法.

总结

可以看到 Flask-Redis 使用起来非常简单, 源码也十分容易理解.