在django/conf/__init__.py里,最后一行,settings = LazySettings()。到LazySettings(),继承自LazyObject,django/utils/functional.py里,初始化的时候self._wrapped为object()。LazyObject也设置了__getattr__,不过差不多。回头看LazySettings的__getattr__,开始要执行_setup,然后使用getattr取值。
----
def _setup(self, name=None):
settings_module = os.environ[ENVIRONMENT_VARIABLE],这个在wsgi脚本,或者在manage.py里有设置,就是项目的setting,例如mysite.settings。然后self._wrapped = Settings(settings_module)。Settings应该是设置值的。
----
Settings集成自BaseSettings,BaseSettings里只有一个__setattr__方法。看Settings的init方法,第一步导入global_settings,在同一个目录里,定义了全局的setting。导入使用dir获得所有变量名,判断变量名如果全为大写,就setattr。然后看BaseSettings,第一个判读"MEDIA_URL", "STATIC_URL",必须以’/‘结尾。然后判断ALLOWED_INCLUDE_ROOTS必须是str,然后就设置。
然后使用import_module()导入项目settings,py3带的这个功能。。。
然后后边类似的判断导入项目settings,其中"INSTALLED_APPS", "TEMPLATE_DIRS"必须是tuple,不能是str不然设置成tuple。必须有SECRET_KEY,设置TIME_ZONE。ok了,导入变量完毕了。
----
self._configure_logging()
settings里的日志设置,先不看了,以后再说。
上一篇: pyrasite项目总结为一条命令
下一篇: 人性
0 Responses so far.