对于Django中settings配置文件的神奇之处我就不谈了,在这里我想模拟Django的配置写一份属于自己的配置文件
在写一个完整的项目之前,我对自定制一个启动文件run.py
import sys import os BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASEDIR) os.environ['AUTO_CLIENT_SETTINGS'] = "conf.settings" from src import script if __name__ == '__main__': script.start()
接下来会按照主函数的逻辑进入我的script文件
from lib.config import settings from .client import AgentClient from .client import SaltSshClient def start(): if settings.MODE == 'AGENT': obj = AgentClient() elif settings.MODE == "SSH" or settings.MODE == 'SALT': obj = SaltSshClient() else: raise Exception('模式仅支持:AGENT/SSH/SALT') obj.exec()
注意上边我标红的那一行,他引用的是配置文件里的settings变量,那么settings变量到底是什么呢?
在整个中,有lib文件夹,lib文件夹下有config文件夹,config文件夹下有__init__.py文件,文件代码如下:
import os import importlib from . import global_settings class Settings(object): """ global_settings,配置获取 settings.py,配置获取 """ def __init__(self): for item in dir(global_settings): if item.isupper(): k = item v = getattr(global_settings,item) setattr(self,k,v) setting_path = os.environ.get('AUTO_CLIENT_SETTINGS') md_settings = importlib.import_module(setting_path) for item in dir(md_settings): if item.isupper(): k = item v = getattr(md_settings,item) setattr(self,k,v) settings = Settings()
注意之前script引用的是该py文件中的一个实例化对象,通过Settings类的__init__方法,我们可以知道,settings在实例化的过程中,分别按照先后顺序把全局的配置文件和普通配置文件里的变量全部赋值给了setting对象(也就是赋予了属性)。
那么这时我们在开始引用的setting就实现了自动读取所有配置文件信息的功能,也就可以在项目中自由自在的使用了。