【非常重要】关于flask框架中使用传入APP创建对象【如FlaskRedis(app)】和先创建对象然后在挂载到app【redis_client.init_app(app)】的区别

使用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)



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值