Flask源碼學習—config配置管理

本身用Flask作了一個博客(www.hbnnlove.sinaapp.com),以前苦於沒有對源碼解析的文檔,只能本身硬着頭皮看。如今我把我本身學習Flask源碼的收穫寫出來,也但願能給後續要學習FLask的人提供一點幫助。先從config提及。python

 

Flask主要經過三種method進行配置:json

 
一、from_envvar
二、from_pyfile
三、from_object
 
其基本代碼:
  app = Flask(__name__)
  app.config = Config   #Config是源碼中config.py中的基類。
  app.config.from_object(或其餘兩種)(default_config) ,default_config是你在project中定義的類。
 
邏輯就是:
  一、app中定義一個config屬性,屬性值爲Config類;
  二、該屬性經過某種方法獲得project中你定義的配置。
 
三種method具體以下:
 
一、from_envvar
從名字中也能夠看出,這種方式是從環境變量中獲得配置值,這種方式若是失敗,會利用第二種方式,原method以下:
def from_envvar(self, variable_name, silent=False):
    """Loads a configuration from an environment variable pointing to
    a configuration file.  
    rv = os.environ.get(variable_name)
    if not rv:
        if silent:
            return False
        raise RuntimeError('The environment variable %r is not set '
                           'and as such configuration could not be '
                           'loaded.  Set this variable and make it '
                           'point to a configuration file' %
                           variable_name)
    return self.from_pyfile(rv, silent=silent)

  

這段代碼,我想你們都能看得懂了。
 
 
二、from_pyfile
filename = os.path.join(self.root_path, filename)
d = types.ModuleType('config')    #d-----<module 'config' (built-in)>
d.__file__ = filename
try:
    with open(filename) as config_file:
        exec(compile(config_file.read(), filename, 'exec'), d.__dict__)
except IOError as e:
    if silent and e.errno in (errno.ENOENT, errno.EISDIR):
        return False
    e.strerror = 'Unable to load configuration file (%s)' % e.strerror
    raise
self.from_object(d)
return True

  

從代碼中能夠看到,該種方式也是先讀取指定配置文件的config,而後寫入到變量中,最後經過from_object方法進行配置。
三、from_object
def from_object(self, obj):
   for key in dir(obj):
       if key.isupper():
        self[key] = getattr(obj, key)

 

從代碼中能夠看出,config中設置的屬性值,變量必須都是大寫的,不然不會被添加到app的config中。
其實還有其餘的方法,如from_json等,但最經常使用的就是上面的三個。
相關文章
相關標籤/搜索