Django中的配置除了用户的配置之外,django还有一个默认的配置,当用户的某个配置没有设置时,Django会从默认配置里找python
接下来,我就模拟一下这种配置django
# 假设这是默认配置 DEBUG = None TIME_ZONE = 'America/Chicago' USE_TZ = False
# 这就是用户配置 DEBUG = True TIME_ZONE = 'Asia/Shanghai' USE_TZ = False # 比起默认配置多了一个 ABC='123'
# 至关于启动文件 import os # os.environ.setdefault(a,b):以字典的格式放入环境变量中 # {'USER_SETTING':'usersetting.setting'} # usersetting.setting:是用户的配置文件的路径 os.environ.setdefault('USER_SETTING', 'usersetting.setting') from conf import setting print(setting.DEBUG)
from conf import global_setting import os import importlib class MySetting(): # dir:返回模块的属性列表 def __init__(self): # 循环得到global_setting的配置名 for setting in dir(global_setting): if setting.isupper(): # 并把配置名和对应值赋给MySetting()的对象 setattr(self, setting, getattr(global_setting, setting)) # 从环境变量中得到用户配置的路径字符串 settings_module = os.environ.get('USER_SETTING') # importlib模块支持传递字符串来导入模块 # 经过importlib模块和用户配置的路径字符串,咱们能够导入用户的配置文件mod mod = importlib.import_module(settings_module) # 以后的操做和上面同样 # 用户中已有的配置会覆盖默认配置 for setting in dir(mod): if setting.isupper(): setattr(self, setting, getattr(mod, setting)) setting = MySetting()