• flask_6:Flask项目配置源码解读


    目录:

    1、查看app.config类型

    2、查看app.config源码

    3、配置方式2-对象中配置:from_object介绍

    重点:

    app.config.from_object() 方法说接收的参数obj可以使str类型,可以是一个模块,甚至是一个类。

     

    1、查看app.config类型:是一个类

    from flask import Flask
    
    app = Flask(__name__)
    print(type(app.config))
    
    
    # 输出结果,是一个类
    <class 'flask.config.Config'>

    2、查看app.config源码:

    class Config(dict):
        def __init__(self, root_path, defaults=None):
            dict.__init__(self, defaults or {})
            self.root_path = root_path
    
        # 读取配置的方法
        def from_envvar(self, variable_name, silent=False):
            pass
    
        def from_pyfile(self, filename, silent=False):
            pass
    
        def from_object(self, obj):
            pass
    
        def from_json(self, filename, silent=False):
            pass
    
        def from_mapping(self, *mapping, **kwargs):
            pass

    查看源码可知,app.config是一个类,继承的是dict类,然后添加了一些几个读取配置的方法,所以app.config可以使用字典的方法,用直接赋值的方法加载配置,也可以用上面定义的几个方法加载配置。

    3、配置方式2-对象中配置:from_object(推荐)

    先来看看from_object()方法的源码:

    复制代码
    def from_object(self, obj):
            if isinstance(obj, string_types):  # 判断obj是否是str类型
                obj = import_string(obj)  # 如果是str类型,就根据这个字符串导入对象
            for key in dir(obj):  # 遍历obj的所有值
                if key.isupper():
                    self[key] = getattr(obj, key)  # self指的就是config实例本身,通过getattr取出对应的值进行
    复制代码

    从源码可以看出,from_object()方法说接收的参数obj可以使str类型,可以是一个模块,甚至是一个类。

    我们先尝试一下是一个模块的情况,创建一个settings.py模块,内容如下:

    DEBUG = False
    TESTING = False

    这里只写了两个配置,你可以写更多,无所谓。怎么使用呢?

    复制代码
    from flask import Flask
    import settings
     
    app = Flask(__name__)
    app.config.from_object(settings)
    print('DEBUG:', app.config.get('DEBUG'))
    print('TESTING:', app.config.get('TESTING'))
    print('A:', app.config.get('A'))
    复制代码

    输出:

    DEBUG: True

    TESTING: True

    A: 123

    当obj是一个字符串时:

    复制代码
    from flask import Flask
     
    app = Flask(__name__)
    app.config.from_object('settings')
    print('DEBUG:', app.config.get('DEBUG'))
    print('TESTING:', app.config.get('TESTING'))
    print('A:', app.config.get('A'))
    复制代码

    输出:

    DEBUG: True

    TESTING: True

    A: 123

    看出来了吗?无论是使用app.config.from_object(settings)还是app.config.from_object('settings')使用的都是使用settings.py文件中的配置,至于原因,如果不明白就回去看看上面的源码。

    如果obj是一个类时,我们修改一下settings.py,如下:

    复制代码
    class Config(object):
        DEBUG = False
        TESTING = False
        DATABASE_URI = 'sqlite://memory:'
    
    class ProductionConfig(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'
    
    class DevelopmentConfig(Config):
        DEBUG = True
    
    class TestingConfig(Config):
        TESTING = True
    复制代码

    在settings.py模块中,我们定义了多个类,首先是Config类,这个类定义的是默认配置,其他类都继承Config类,每一个之类代表一种配置,如果需要子类中可以覆写Config,如果不覆写则使用Config中的默认配置。怎么使用呢?

    复制代码
    from flask import Flask
    import settings
     
    app = Flask(__name__)
    app.config.from_object(settings.ProductionConfig)
    print('DEBUG:', app.config.get('DEBUG'))
    print('TESTING:', app.config.get('TESTING'))
    print('DATABASE_URI:', app.config.get('DATABASE_URI'))
    复制代码

    输出:

    DEBUG: False

    TESTING: False

    DATABASE_URI: mysql://user@localhost/foo

    使用这种方法的好处是可以充分利用面向对象中继承等的优良特性共享配置,设置多套配置,使用时,只需要针对实际需要修改app.config.from_object(settings.ProductionConfig)中传入的类即可。这种方法在实际开发中也是使用最多的。

    本文参考自:从源码看Flask框架配置管理

    其他几种加载方式都在原博客中讲述,且原博主文章质量很高,讲解通熟易懂,排版清晰明朗,已关注原博主,建议看到的小伙伴关注。

  • 相关阅读:
    git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法
    Android pix转换为sp
    职业四象限,分分钟定位你的方向
    我的微信公众号开通了!
    Android PermissionChecker 权限全面详细分析和解决方案
    Android沉浸式(侵入式)标题栏(状态栏)Status(三)
    Android沉浸式(侵入式)标题栏(状态栏)Status(二)
    Android沉浸式(侵入式)标题栏(状态栏)Status(一)
    为毛老抱怨工资低又不离职
    面试题:return和finally执行
  • 原文地址:https://www.cnblogs.com/hailin2018/p/13577714.html
Copyright © 2020-2023  润新知