settings源码分析

settings源码

Django有两个配置文件
	一个是暴露给用户自定义的配置
    一个是项目默认的配置
用户在没有配置的情况下使用的是项目默认的配置,用户配置了的情况下使用的是用户的配置
如何实现:先读取项目默认的配置,在读取用户定义的配置,字典的键存在则值进行替换,不存在则创建

from django.conf import settings

class LazySettings(...):
	def _setup(self, name=None):
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 'day53.settings'
		self._wrapped = Settings(settings_module)  # Settings('day53.settings')
    
class Settings(object):
    def __init__(self, settings_module):  # 'day53.settings'
        # 先导入默认的配置
        for setting in dir(global_settings):  # 获取全局配置文件可以点的变量名
            if setting.isupper():  # 校验配置必须全大写
                setattr(self, setting, getattr(global_settings, setting))
                # setting指代的是所有全大写的变量名
                # getattr(global_settings, setting)获取全大写变量名对应的值
                # 给对象设置属性 可以简单的理解为 给字典添加键值对
        self.SETTINGS_MODULE = settings_module  # 'day53.settings'
        # 再导入用户的配置,默认有的话进行覆盖
        mod = importlib.import_module(self.SETTINGS_MODULE)
		for setting in dir(mod):  # 获取
            if setting.isupper():
                setting_value = getattr(mod, setting)
                setattr(self, setting, setting_value)
                
settings = LazySettings(...)

编程思想

利用importlib模块和双配置文件进行,给用户一个配置,自己写一个默认的配置,和Django的配置一样

posted @ 2021-06-30 20:47  zheng-sn  阅读(78)  评论(0)    收藏  举报