模拟Django的settings配置

模拟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()
posted @ 2019-01-08 16:16  藏岚  阅读(260)  评论(0编辑  收藏  举报