flask_config

载入配置

flask 载入配置主要有以下方法

之间的关系是 from_envvar 实际调用了 from_pyfile, from_pyfile 会调用 from_object; from_json 底层具体实现调用了 from_mapping.

from_object

文档中建议是用来载入默认的配置文件,而不是载入真实的配置,一般用法有

app.config.from_object('config.DevelopmentConfig')
# or this way
from config import DevelopmentConfig
app.config.from_object(DevelopmentConfig)

配置文件对象或者字符串都是可行的(字符串的话,会使用werkzeug.utils.import_string 来导入实际的对象),具体的实现也是很简单,代码如下:

for key in dir(obj):
    if key.isupper():
        self[key] = getattr(obj, key)

from_pyfile

正如其名,从 python 文件中导入配置,常见用法:

app.config.from_pyfile('my_config.py')

具体实现的简化版本如下:

filename = os.path.join(self.root_path, filename)
d = types.ModuleType('config')
d.__file__ = filename
with open(filename) as config_file:
    exec(compile(config_file.read(), filename, 'exec'), d.__dict__)
self.from_object(d)
return True

而其具体实现中,最后也是调用了 from_object

from_envvar

这个用法主要是载入你环境变量指向的配置文件:

app.config.from_envvar('MY_SETTINGS')

它其实也等同于:

app.config.from_pyfile(os.environ['MY_SETTINGS'])

所以其实 from_envvar 是一个快捷方式,具体实现还是调用了 from_pyfile

from_mapping

flask 1.0 中加入,从键值对中载入数据,常见用法

app.config.from_mapping({'SECRET_KEY': 'blalbla'}, DEBUG=True)

from_json

flask 1.0 中加入的,从 json 文件中载入配置,常见用法如下:

app.config.from_json('my_config.json')

具体实现其实调用了 from_mapping,就是把 json 文件内容 load 到某个 json 对象, 传给 from_mapping 就好了,from_json 的简化版本实现:

filename = os.path.join(self.root_path, filename)
with open(filename) as json_file:
    obj = json.loads(json_file.read())
return self.from_mapping(obj)

实际生产中的应用

一般来说,都是载入基本默认配置,然后根据实际需求进行配置的更新和覆盖。比如说使用以下样子, 基本配置 Config,不同场景增加或重写配置选项,然后选择使用。

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

但是有时候,配置文件中可能有一些不应当暴露出来的配置,我们可以选择使用 from_envvar 来载入真实配置,或者使用 instance folder.

按照文档的说法:

The instance folder is designed to not be under version control and be deployment specific. It’s the perfect place to drop things that either change at runtime or configuration files.

所以可以选择把敏感的配置文件选择放在 instance folder 中,然后载入配置

参考