模拟Django的settings配置
Django中的配置除了用户的配置以外,django还有一个默认的配置,当用户的某个配置没有设置时,Django会从默认配置里找
接下来,我就模拟一下这种配置
项目格式
global_setting.py
# 假设这是默认配置
DEBUG = None
TIME_ZONE = 'America/Chicago'
USE_TZ = False
setting.py
# 这就是用户配置
DEBUG = True
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
# 比起默认配置多了一个
ABC='123'
test.py
# 相当于启动文件
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)
init.py
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()