注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

哈欠涟涟的博客

学习python、pyqt与django

 
 
 

日志

 
 

在django settings中获取配置信息的原理  

2010-10-14 12:43:50|  分类: django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
获取配置信息方法:
>>> from django.conf import settings
>>> settings.*** #就可以得到相应的配置信息

问题是在设置配置信息时,我们是在工程文件夹下settings.py文件中设置的,但模块django.conf系统本身带来的,如何会从用户的settings.py获取配置信息呢?
打开..\django\conf\,可以看到并没有settings.py,所以打开__init__.py来看看,可以看到最后一行是:
   settings = LazySettings()
接着去看类LazySettings,可以看到是LazyObject的子类。
找到..\django\utils\functional.py去看类LazyObject的源码:
   在类doc中,可以看到这个类的作用是为了延迟实例化被包裹的类。
class LazyObject(object):
   def __init__(self):
       self._wrapped = None
   def __getattr__(self, name):
       if self._wrapped is None
           self._setup()
       return getattr(self._wrapped, name)
   def __setattr__(self, name, val):
       if name == "_wrapped':
           self.__dict__["_wrapped"] = val
       else:
           if self._wrapped in None:
               self._setup()
           setattr(self._wrapped, name,val)
   此类的主要实现就是这两个方法,还有一个_setup()则是在子类中实现中。

class LazySetting(LazyObject):
     def _setup(self):
         ...
         #获取settings_module
         settings_module = os.environ["DJANGO_SETTINGS_MODULE"]
         ...
         self._wrapped = Settings(settings_module)

从上面的代码中看到_wrapped实际上是类Settings的实例
接着看类Settings的源码:
class Settings(object):
    def __init__(self,settings_module):
        # 先从global settings中导入设置
        for setting in dir(global_settings):
            ...
            setattr(self, settings,getattr(global_settings,setting))

        # 导入模块用户的settings.py
        mod = importlib.import_module(settings_module)
        for setting in mod:
            ...
            setattr(self,settings, setting_val) # setting_val是从setting中获取的
        #后面对INSTALLED_APPS作了一些处理

如果不考虑性能的话,实际上只要有Settings类就行,就能完成上述功能。
  评论这张
 
阅读(1295)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017