实际工程开发中常常会对开发、测试和生产等不同环境配置不同的数据库环境,传统方式可以通过添加不同环境的配置文件达到部署时的动态切换的效果。这种方式还不错,不过不同环境间往往会共享相同的配置而造成一些重复工作。Python Flask 的作者采用的则是通过类继承的方式共享相同的配置,使用起来个人觉得更为优雅。但如果在非 Flask 应用中想使用这种配置方式就比较麻烦了,毕竟为了一个配置选项而引入一个并不需要使用的第三方库是非常不划算的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from os import getenv

basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):
    DEBUG = False
    TESTING = False
    MYSQL_HOST = getenv('MYSQL_HOST', '192.168.1.1')

    # get attribute
    def __getitem__(self, key):
        return self.__getattribute__(key)


class ProductionConfig(Config):
    DEBUG = False
    MSSQL_HOST = getenv('MSSQL_HOST', '192.168.8.8')


class DevelopmentConfig(Config):
    DEBUG = True
    MSSQL_HOST = getenv('MSSQL_HOST', '192.168.4.4')


class TestingConfig(Config):
    TESTING = True


mapping = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

APP_ENV = os.environ.get('APP_ENV', 'default').lower()
config = mapping[APP_ENV]()

有了这个配置类,我们在其他文件中引用这些配置变量就非常方便了,借助魔法方法 getitem, 使用属性或者字典的方式均可读取配置内容。

from config import config

config.MYSQL_HOST
# or
config['MYSQL_HOST']