使用redis框架来做讲解 FlaskRedis(app)和redis_client.init_app(app)用法区别
flask-redis框架源码
flask-redis插件源代码
try:
import redis
except ImportError:
# We can still allow custom provider-only usage without redis-py being installed
redis = None
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)
@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
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
def __getattr__(self, name):
return getattr(self._redis_client, name)
def __getitem__(self, name):
return self._redis_client[name]
def __setitem__(self, name, value):
self._redis_client[name] = value
def __delitem__(self, name):
del self._redis_client[name]
一、创建 FlaskRedis(app)实例就传入app的方法【直截了当,由于每个页面传入app,不是很方便, 虽然flask提供了current_app】
最直接的方式,创建对象FlaskRedis(app)传入APP,这里的redis_client可以直接操控内部的self._redis_client属性,因为已经app初始化了
from flask import Flask
from flask_redis import FlaskRedis
app = Flask(__name__)
redis_client = FlaskRedis(app)
#这里是成功的【因为内部的self._redis_client已经APP初始化完毕】
redis_client["key"] = "redis"
第二种方式:先创建对象然后在挂载到app【方便封装管理,但务必注意没初始化之前访问权限】
先创建FlaskRedis(),然后在在__init__.py中导入挂载APP,这里的redis_client对象内部self._redis_client属性为None,因为还没APP初始化
own_redis.py文件
from flask_redis import FlaskRedis
redis_client = FlaskRedis()
所以这后面的redis_client对象无法操控redis_client,只能在api调用的时候才能访问【这个后面只能创建新的类,等待api访问的时候才能调用】
#这里会报错【因为内部的self._redis_client为None】
redis_client["key"] = "redis"
__init__.py【所以APP插件初始化的文件】
def __app_register_redis(self):
from app.libs.redis.own_redis import redis_client
redis_client.init_app(self.app)