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框架配置管理

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

 

posted @ 2020-08-28 15:19  一路向北321  阅读(271)  评论(0编辑  收藏  举报