如何理解 flask 中的 Blueprint 的 name 參數(shù)

我一直以為 Blueprint 中的 name 參數(shù)和 url_for 中所用到的 endpoint (端點(diǎn))有關(guān)洪添,下面是我為什么這樣理解的垦页。

1、問題

通常我們?cè)?flask 項(xiàng)目中使用藍(lán)圖的時(shí)候是這樣定義藍(lán)圖的:

admin = Blueprint('666', __name__)

其中干奢,第一個(gè)參數(shù)究竟有什么作用痊焊?能否隨便命名,或者干脆不命名忿峻?薄啥?

答案是 否定的!9渖小垄惧!

2、解惑

首先绰寞,我們看一下 flask 的源碼: https://github.com/pallets/flask/blob/master/flask/blueprints.py
其中到逊,有下面的代碼:

class Blueprint(_PackageBoundObject):
    ...
    ...
    def __init__(self, name, import_name, static_folder=None,
                 static_url_path=None, template_folder=None,
                 url_prefix=None, subdomain=None, url_defaults=None,
                 root_path=None):
        _PackageBoundObject.__init__(self, import_name, template_folder,
                                     root_path=root_path)
        self.name = name
        self.url_prefix = url_prefix
        self.subdomain = subdomain
        self.static_folder = static_folder
        self.static_url_path = static_url_path
        self.deferred_functions = []
        if url_defaults is None:
            url_defaults = {}
        self.url_values_defaults = url_defaults

上面的代碼可以明顯的看到, Blueprint 類繼承與 _PackageBoundObject滤钱,其中蕾管,name 參數(shù),可是該類自己定義的菩暗,不是繼承的掰曾,那么,我們繼續(xù)在源碼中查找 name 參數(shù)的作用停团。

在該類中尋找 self.name旷坦, 我們可以看到另外 8 處內(nèi)容掏熬, 分別在該類的 before_request、afte\r_request秒梅、teardown_request旗芬、context_processor、url_value_preprocessor捆蜀、url_defaults疮丛、errorhandler、register_error_handle 這 8 個(gè)類函數(shù)中辆它,基本上函數(shù)中用到的地方都是:

 self.record_once(lambda s: s.app.before_request_funcs
            .setdefault(self.name, []).append(f))

那么誊薄,我們?cè)倏纯催@個(gè) record_once 函數(shù)的作用,該函數(shù)也是在該類中定義的锰茉。

    def record_once(self, func):
        """Works like :meth:`record` but wraps the function in another
        function that will ensure the function is only called once.  If the
        blueprint is registered a second time on the application, the
        function passed is not called.
        """
        def wrapper(state):
            if state.first_registration:
                func(state)
        return self.record(update_wrapper(wrapper, func))

通過注釋呢蔫,很明顯地看到這個(gè)函數(shù)的作用是為了將 name 參數(shù)作為唯一標(biāo)識(shí),在程序上下文中區(qū)分藍(lán)圖所用的。

那么飒筑,回到原來的問題片吊。

一、之所以可以隨便定義名稱协屡,感覺沒有什么影響俏脊,那是錯(cuò)覺。

  • 第一個(gè)原因肤晓,很多時(shí)候联予,我們僅僅只是定義了一個(gè)藍(lán)圖,如果你再定義一個(gè)材原,你把 兩個(gè)藍(lán)圖的 name 參數(shù)設(shè)置成一樣的沸久,你試試程序會(huì)不會(huì)報(bào)錯(cuò)。
  • 第二個(gè)原因余蟹,沒有用到 url_for 函數(shù)卷胯,這個(gè)函數(shù)中會(huì)用到藍(lán)圖的 name 參數(shù),或者我們直接這樣簡(jiǎn)化的調(diào)用 url_for('.index') 函數(shù)威酒, 那個(gè) '.' 代表了當(dāng)前的藍(lán)圖窑睁。
  • 還是回到 url_for 函數(shù),如果在 html 的 jinja2 中調(diào)用葵孤,得這樣寫 url_for('name.index')担钮,其中的 name 就是藍(lán)圖的 name 參數(shù)。

二尤仍、建議大家試試如果不定義 name 參數(shù)箫津,程序會(huì)不會(huì)報(bào)錯(cuò)。結(jié)果是必定報(bào)錯(cuò),因?yàn)檫@個(gè)參數(shù)是必須的苏遥。

  • 在 view 視圖中饼拍,我們使用 裝飾器 的寫法,一般是把函數(shù)名稱當(dāng)做 endpoint 的田炭,如果你在兩個(gè)不同的藍(lán)圖中师抄,使用同一個(gè)名稱來定義視圖函數(shù),那么 endpoint 按照默認(rèn)方案就無法是 唯一標(biāo)識(shí) 了教硫,必須得加上藍(lán)圖的名稱叨吮,所以藍(lán)圖的名稱也得是唯一的。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞬矩,一起剝皮案震驚了整個(gè)濱河市茶鉴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丧鸯,老刑警劉巖蛤铜,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫩絮,死亡現(xiàn)場(chǎng)離奇詭異丛肢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剿干,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蜂怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人置尔,你說我怎么就攤上這事杠步。” “怎么了榜轿?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵幽歼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谬盐,道長(zhǎng)甸私,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任飞傀,我火速辦了婚禮皇型,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砸烦。我一直安慰自己弃鸦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布幢痘。 她就那樣靜靜地躺著唬格,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上西轩,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天员舵,我揣著相機(jī)與錄音,去河邊找鬼藕畔。 笑死马僻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的注服。 我是一名探鬼主播韭邓,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼溶弟!你這毒婦竟也來了女淑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辜御,失蹤者是張志新(化名)和其女友劉穎鸭你,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擒权,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袱巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碳抄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愉老。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剖效,靈堂內(nèi)的尸體忽然破棺而出嫉入,到底是詐尸還是另有隱情,我是刑警寧澤璧尸,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布咒林,位于F島的核電站,受9級(jí)特大地震影響爷光,放射性物質(zhì)發(fā)生泄漏垫竞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一瞎颗、第九天 我趴在偏房一處隱蔽的房頂上張望件甥。 院中可真熱鬧,春花似錦哼拔、人聲如沸引有。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽譬正。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曾我,已是汗流浹背粉怕。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抒巢,地道東北人贫贝。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛉谜,于是被迫代替她去往敵國(guó)和親稚晚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停型诚,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,182評(píng)論 22 257
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理客燕,服務(wù)發(fā)現(xiàn),斷路器狰贯,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 在flask框架中也搓,我們經(jīng)常會(huì)遇到endpoint這個(gè)東西,最開始也沒法理解這個(gè)到底是做什么的涵紊。最近正好在研究Fl...
    卡薩諾瓦_(dá)閱讀 944評(píng)論 0 0
  • 可以翻譯成“視圖入口”傍妒,就是個(gè)名字。url_for可以用到栖袋,其他方面也可以用到(比如導(dǎo)航條確定當(dāng)前頁(yè)面)拍顷,因?yàn)閑n...
    卡薩諾瓦_(dá)閱讀 730評(píng)論 0 0
  • 白鶴是班上最漂亮的女生抚太,小巧的瓜子臉塘幅,大大的眼睛,四肢修長(zhǎng)尿贫。高一選班干部時(shí)电媳,她毛遂自薦,任文藝委員一職庆亡。 ...
    禾叁閱讀 370評(píng)論 0 0