继续看execute() 函数,分析下 settings.INSTALLED_APPS 作用机制,看看作为可能在整个 web 程序起配置作用的配置模块是如何构建的.
try:
options, args = parser.parse_known_args(self.argv[2:])
handle_default_options(options)except CommandError:pass# Ignore any option errors at this point.try:
settings.INSTALLED_APPS
settings = LazySettings()classLazySettings(LazyObject):"""
A lazy proxy for either global Django settings or a custom settings object.
The user can manually configure settings prior to using them. Otherwise,
Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
"""def_setup(self, name=None):...
self._wrapped = Settings(settings_module)...def__getattr__(self, name):"""Return the value of a setting and cache it in self.__dict__."""if self._wrapped is empty:
self._setup(name)
val =getattr(self._wrapped, name)
self.__dict__[name]= val
return val
def__setattr__(self, name, value):"""
Set the value of setting. Clear all cached values if _wrapped changes
(@override_settings does this) or clear single values when set.
"""if name =='_wrapped':
self.__dict__.clear()else:
self.__dict__.pop(name,None)super().__setattr__(name, value)
def_setup(self, name=None):"""
Load the settings module pointed to by the environment variable. This
is used the first time settings are needed, if the user hasn't
configured settings manually.
"""
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)ifnot settings_module:
desc =("setting %s"% name)if name else"settings"raise ImproperlyConfigured("Requested %s, but settings are not configured. ""You must either define the environment variable %s ""or call settings.configure() before accessing settings."%(desc, ENVIRONMENT_VARIABLE))
self._wrapped = Settings(settings_module)
classSettings:def__init__(self, settings_module):# update this dict from global settings (but only for ALL_CAPS settings)# 设置默认配置for setting indir(global_settings):if setting.isupper():setattr(self, setting,getattr(global_settings, setting))# store the settings module in case someone later cares
self.SETTINGS_MODULE = settings_module
# 加载配置文件 settings.py
mod = importlib.import_module(self.SETTINGS_MODULE)
tuple_settings =("INSTALLED_APPS","TEMPLATE_DIRS","LOCALE_PATHS",)
self._explicit_settings =set()for setting indir(mod):if setting.isupper():
setting_value =getattr(mod, setting)if(setting in tuple_settings andnotisinstance(setting_value,(list,tuple))):raise ImproperlyConfigured("The %s setting must be a list or a tuple. "% setting)setattr(self, setting, setting_value)
self._explicit_settings.add(setting)...