实现类似Django的文件配置

在Django项目中,有两个关于配置的文件,一个是用户自定义的配置文件settings.py,一个是系统默认的配置文件global_settings.py,此外还有一个是能够获取以上两个配置文件信息的settings对象

上述实现的效果是:用户自定义的配置优先级高于系统默认的(用户配置使用用户的,没有配置使用默认的),而conf下的__init__.py则拥有一个settings对象,用于获取...

代码实现1

from MySettings.lib.conf import setting


if __name__ == '__main__':
    # 获取配置文件的DEBUG设置
    print(setting.DEBUG)
bin目录下的start.py
# 用户自定义文件
DEBUG = True
conf目录下的settings.py
# 系统默认配置文件
DEBUG = False
lib/conf/下的global.settings.py
from MySettings.conf import settings
from MySettings.lib.conf import global_settings


class LazySettings:
    def __init__(self):
        self.__setattr(global_settings)
        self.__setattr(settings)

    def __setattr(self, conf):
        res = dir(conf)
        for key in res:
            if key.isupper():
                setattr(self, key, getattr(conf, key))
    
    # 对不存在的属性访问,做点号拦截,增强程序健壮性
    def __getattr__(self, item):
        return "没有该项配置"

setting = LazySettings()
lib/conf目录下的__init__.py

代码实现2

# 上面对于用户配置文件的导入是使用模块导入的方法,我们改用环境变量
import os
# 注意添加环境变量要在导入模块之前
os.environ["settings"] = "MySettings.conf.settings"
from MySettings.lib.conf import settings


if __name__ == '__main__':
    print(settings.DEBUG)
bin目录下的start.py
import os
from MySettings.lib.conf import global_settings
import importlib

class LazySettings:
    def __init__(self):
        self.__setattr(global_settings)
        res = os.environ.get("settings")
        settings = importlib.import_module(res)
        self.__setattr(settings)

    def __setattr(self, conf):
        res = dir(conf)
        for key in res:
            if key.isupper():
                setattr(self, key, getattr(conf, key))

    def __getattr__(self, item):
        return "没有该项配置"

settings = LazySettings()
lib/conf目录下的__init__.py
posted @ 2019-01-08 17:13  风中琉璃  阅读(172)  评论(0)    收藏  举报