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的配置一样

浙公网安备 33010602011771号