flask配置相關(guān)源碼

FLASK類

config 配置源碼解讀

構(gòu)建一個(gè)app應(yīng)用

示例代碼

from flask import Flask
import os

#定義一個(gè)配置類
class development():
    SECRET_KEY = os.environ.get('SECRET_KEY') or os.urandom(24)
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = True

#把配置類放到字典里
config = {
    "dev": development
}

app = Flask(__name__)

app.config.from_object(config['dev'])

print(app.config)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

app是Flask類的實(shí)例,以下是Flask類的與config相關(guān)的源碼

# 定義了一個(gè)默認(rèn)的配置字典
default_config = ImmutableDict(
        {
            ...
            "SECRET_KEY": None,
            ...
        }
      )
class Flask(_PackageBoundObject):
    ...
    self.config = self.make_config(instance_relative_config)
    # app的config 由make_config方法處理
    ...
    def make_config(self, instance_relative=False):
        ...
        root_path = self.root_path #這里的root_path 是None
        if instance_relative: # 這里是False
            root_path = self.instance_path
        defaults = dict(self.default_config)
        defaults["ENV"] = get_env()
        defaults["DEBUG"] = get_debug_flag()
        return self.config_class(root_path, defaults) 
繼續(xù)找這里返回的config_class,由下面代碼可以看出實(shí)際上返回了一個(gè)默認(rèn)配置的字典defaults,就是上面定義的那個(gè),這個(gè)時(shí)候的app.config就是一個(gè)字典default_config
app.config.form_object(config['dev'],這里config['dev']是一個(gè)字典,看from_object做了什么工作,這個(gè)函數(shù)從config['dev']這個(gè)字典里拿出配置的參數(shù),如果原來(lái)默認(rèn)字典里有的就修改,沒(méi)有的就添加.
config_class = Config
    
    class Config(dict):
        def __init__(self, root_path, defaults=None):
            dict.__init__(self, defaults or {})
            self.root_path = root_path
    
        def from_object(self, obj):
            if isinstance(obj, string_types): #這里的obj是一個(gè)字符串
                obj = import_string(obj) #這里是可以從一個(gè)py文件導(dǎo)入的邏輯
            for key in dir(obj): #這里的obj是一個(gè)字典
                if key.isupper(): #配置字典里的配置項(xiàng)要大寫(xiě)的才能獲取到
                    self[key] = getattr(obj, key)
        
    def get_env():
        """Get the environment the app is running in, indicated by the
        :envvar:`FLASK_ENV` environment variable. The default is
        ``'production'``.
        """
        return os.environ.get("FLASK_ENV") or "production"

utils里的import_string方法

def import_string(import_name, silent=False):
    # force the import name to automatically convert to strings
    # __import__ is not able to handle unicode strings in the fromlist
    # if the module is a package
    import_name = str(import_name).replace(":", ".")
    try:
        try:
            __import__(import_name)
        except ImportError:
            if "." not in import_name:
                raise
        else:
            return sys.modules[import_name]

        module_name, obj_name = import_name.rsplit(".", 1)
        module = __import__(module_name, globals(), locals(), [obj_name])
        try:
            return getattr(module, obj_name)
        except AttributeError as e:
            raise ImportError(e)

    except ImportError as e:
        if not silent:
            reraise(
                ImportStringError, ImportStringError(import_name, e), sys.exc_info()[2]
            )

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市烘挫,隨后出現(xiàn)的幾起案子赤惊,更是在濱河造成了極大的恐慌墓阀,老刑警劉巖禾乘,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惋耙,死亡現(xiàn)場(chǎng)離奇詭異乱陡,居然都是意外死亡浇揩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門憨颠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胳徽,“玉大人,你說(shuō)我怎么就攤上這事爽彤⊙粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵适篙,是天一觀的道長(zhǎng)往核。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚷节,這世上最難降的妖魔是什么聂儒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任虎锚,我火速辦了婚禮,結(jié)果婚禮上衩婚,老公的妹妹穿的比我還像新娘窜护。我一直安慰自己,他們只是感情好谅猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布柄慰。 她就那樣靜靜地躺著,像睡著了一般税娜。 火紅的嫁衣襯著肌膚如雪坐搔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天敬矩,我揣著相機(jī)與錄音概行,去河邊找鬼。 笑死弧岳,一個(gè)胖子當(dāng)著我的面吹牛凳忙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禽炬,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涧卵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腹尖?” 一聲冷哼從身側(cè)響起柳恐,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎热幔,沒(méi)想到半個(gè)月后乐设,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绎巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年近尚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片场勤。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戈锻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出和媳,到底是詐尸還是另有隱情格遭,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布窗价,位于F島的核電站如庭,受9級(jí)特大地震影響叹卷,放射性物質(zhì)發(fā)生泄漏撼港。R本人自食惡果不足惜坪它,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帝牡。 院中可真熱鬧往毡,春花似錦、人聲如沸靶溜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罩息。三九已至嗤详,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓷炮,已是汗流浹背葱色。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娘香,地道東北人苍狰。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烘绽,于是被迫代替她去往敵國(guó)和親淋昭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348