flask 藍(lán)圖

解釋1:

允許將應(yīng)用組織為模塊留搔,每個(gè)模塊有自洽的 MVC惰匙,開發(fā)者做些工作可以使模塊間依賴盡可能少译红,必要時(shí)可以按 blueprint 為單位做垂直拆分预茄。

依賴反轉(zhuǎn),允許把 route 掛到 blueprint 對(duì)象而非全局 app 對(duì)象上侦厚。

解釋2:

1 概述

藍(lán)圖/Blueprint是Flask應(yīng)用程序組件化的方法耻陕,可以在一個(gè)應(yīng)用內(nèi)或跨越 多個(gè)項(xiàng)目共用藍(lán)圖。使用藍(lán)圖可以極大地簡(jiǎn)化大型應(yīng)用的開發(fā)難度刨沦,也為Flask擴(kuò)展 提供了一種在應(yīng)用中注冊(cè)服務(wù)的集中式機(jī)制诗宣。

2 初識(shí)藍(lán)圖

藍(lán)圖/Blueprint對(duì)象用起來和一個(gè)應(yīng)用/Flask對(duì)象差不多,最大的區(qū)別在于一個(gè) 藍(lán)圖對(duì)象沒有辦法獨(dú)立運(yùn)行想诅,必須將它注冊(cè)到一個(gè)應(yīng)用對(duì)象上才能生效召庞。

使用藍(lán)圖可以分為三個(gè)步驟

1.創(chuàng)建一個(gè)藍(lán)圖對(duì)象

ezbp =Blueprint("ezbp",__name__)

2.在這個(gè)藍(lán)圖對(duì)象上進(jìn)行操作,入注冊(cè)路由侧蘸、指定靜態(tài)文件夾裁眯、注冊(cè)模板過濾器...

@ezbp.route('/')defezbp_index():return'Welcome to my blueprint'

3.在應(yīng)用對(duì)象上注冊(cè)這個(gè)藍(lán)圖對(duì)象

app.register_blueprint(ezbp,url_prefix='/ezbp')

當(dāng)這個(gè)應(yīng)用啟動(dòng)后,通過/ezbp/可以訪問到藍(lán)圖中定義的視圖函數(shù)讳癌。

考察上面的代碼,可以看到在藍(lán)圖對(duì)象上注冊(cè)路由的方法和在應(yīng)用對(duì)象上完全 一樣存皂,那么晌坤,值得思考的是逢艘,藍(lán)圖和應(yīng)用對(duì)象的運(yùn)行機(jī)制是一樣的嗎?

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprintapp= Flask(__name__)

@app.route('/')defapp_index():return'go blueprint'ezbp = Blueprint("ezbp",__name__)

@ezbp.route('/')defezbp_index():return'Welcome to my blueprint'app.register_blueprint(ezbp,url_prefix='/ezbp')

app.run(host='0.0.0.0',port=80)

ouptut:

3?運(yùn)行機(jī)制———說白了就是會(huì)自動(dòng)補(bǔ)充URL前綴骤菠,并且能使用相同的視圖函數(shù)

藍(lán)圖并不是一個(gè)可插拔的應(yīng)用 —— 它只是保存了一組將來可以在應(yīng)用對(duì)象上執(zhí)行 的操作—— 注冊(cè)路由就是一種操作它改。

當(dāng)在應(yīng)用對(duì)象上調(diào)用route 裝飾器或使用add_url_rule()方法注冊(cè)路由時(shí), 我們已經(jīng)知道商乎,這個(gè)操作將修改應(yīng)用對(duì)象的兩張路由表:url_map和view_functions央拖; 然而,藍(lán)圖對(duì)象根本就沒有路由表鹉戚,當(dāng)我們?cè)谒{(lán)圖對(duì)象上調(diào)用route裝飾器或使用?add_url_rule()方法注冊(cè)路由時(shí)鲜戒,它只是在內(nèi)部的一個(gè)延遲操作記錄列表defered_functions中添加了一項(xiàng):下圖為blueprint和FLask route的對(duì)比

lambad s: s.add_url_rule('/',view_func=ezbp_index)定義了一個(gè)匿名函數(shù), 參數(shù)s就是將來被傳入的應(yīng)用對(duì)象抹凳。當(dāng)執(zhí)行應(yīng)用對(duì)象的register_blueprint()方法時(shí)遏餐,應(yīng)用對(duì)象將從藍(lán)圖對(duì)象的defered_functions列表中取出每一項(xiàng),并以自身 作為參數(shù)執(zhí)行該匿名函數(shù) —— 即調(diào)用應(yīng)用對(duì)象的add_url_rule()方法赢底,這將真正的 修改應(yīng)用對(duì)象的兩張路由表失都。

所以說,藍(lán)圖這個(gè)名字起得的確恰當(dāng)幸冻,藍(lán)圖的那些方法僅僅記錄了未來應(yīng)該發(fā)生的操作粹庞, 而不是當(dāng)即實(shí)現(xiàn)。

2 藍(lán)圖的URL前綴

繼續(xù)使用前一節(jié)的圖洽损,注意其中被橘黃色熒光筆涂抹的代碼:

當(dāng)我們?cè)趹?yīng)用對(duì)象上注冊(cè)一個(gè)藍(lán)圖時(shí)庞溜,需要指定一個(gè)url_prefix關(guān)鍵字 參數(shù)(這個(gè)參數(shù)默認(rèn)是/)。在上面的圖中可以看到趁啸,在應(yīng)用最終的路由表url_map中强缘,在藍(lán)圖上注冊(cè)的路由URL自動(dòng)被加上了這個(gè)前綴。

這相當(dāng)有用不傅,我們可以在多個(gè)藍(lán)圖中使用相同的URL規(guī)則而不會(huì)最終引起沖突旅掂,只要在 注冊(cè)藍(lán)圖時(shí)將不同的藍(lán)圖掛接到不同的自路徑即可 —— 想一想對(duì)于大型應(yīng)用而言,不同 的藍(lán)圖通常是不同的人員開發(fā)的访娶,你很難保證URL規(guī)則不發(fā)生沖突商虐!

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprint

shop= Blueprint('shop','shop')

@shop.route('/')defv_index():return'shop root'vip= Blueprint('vip','vip')

@vip.route('/')defv_index():return'vip homepage'admin= Blueprint('admin','admin')

@admin.route('/')defv_index():return'admin root'app= Flask(__name__)

app.register_blueprint(shop,url_prefix='/')

app.register_blueprint(admin,url_prefix='/admin')

app.register_blueprint(vip,url_prefix='/vip')

app.run(host='0.0.0.0',port=80)

output:

4?藍(lán)圖的endpoint———加上藍(lán)圖前綴

圖繼續(xù),這次關(guān)注綠色熒光筆涂抹的代碼:

我們創(chuàng)建藍(lán)圖對(duì)象時(shí)崖疤,第一個(gè)參數(shù)指定了藍(lán)圖的名字秘车。當(dāng)在應(yīng)用中注冊(cè)藍(lán)圖時(shí), 藍(lán)圖的路由項(xiàng)中的訪問點(diǎn)endpoint被自動(dòng)添加了這個(gè)名字劫哼。

這有什么用叮趴?這涉及到url_for()的正確工作與否。

當(dāng)不同的團(tuán)隊(duì)開發(fā)不同的藍(lán)圖時(shí)权烧,和URL規(guī)則類似眯亦,你很難保證他們的視圖函數(shù)名 彼此不同伤溉,尤其像index這樣俗套的名字。如果不對(duì)來自不同藍(lán)圖的endpoint 進(jìn)行區(qū)隔妻率,那么url_for('index')到底應(yīng)該生成那個(gè)URL乱顾?這顯然無法確定。

一旦給不同藍(lán)圖的endpoint加上了藍(lán)圖名前綴宫静,我們可以確切地告訴url_for()?了:

url_for('shop.v_index')#/shop/url_for('admin.v_index')#/admin/

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprint,url_for,render_template_string

shop= Blueprint('shop',__name__)

@shop.route('/')defv_index():return'''

  • Here is shop you can go admin
  • '''admin= Blueprint('admin',__name__)

    @admin.route('/')defv_index():return'''

  • Here is admin you can go shop
  • '''app= Flask(__name__)

    app.register_blueprint(shop,url_prefix='/shop')

    app.register_blueprint(admin,url_prefix='/admin')

    @app.route('/')defv_index():

    tpl='''

    • shop
    • admin
    • '''returnrender_template_string(tpl)

      app.run(host='0.0.0.0',port=80)

      ouput:

      5?注冊(cè)靜態(tài)目錄路由

      和應(yīng)用對(duì)象不同走净,藍(lán)圖對(duì)象創(chuàng)建時(shí)不會(huì)默認(rèn)注冊(cè)靜態(tài)目錄的路由。需要我們?cè)?創(chuàng)建時(shí)指定static_folder參數(shù)孤里。

      下面的示例將藍(lán)圖所在目錄下的ezstatic目錄設(shè)置為靜態(tài)目錄:

      admin = Blueprint("admin",__name__,static_folder='ezstatic')

      app.register_blueprint(admin,url_prefix='/admin')

      默認(rèn)情況下Flask使用文件夾的名稱注冊(cè)靜態(tài)文件夾的路由:

      +------------------------------------------------------------------+

      |? url? ? ? ? ? ? | endpoint? ? ? ? | view_function? ? ? ? ? ? ? |

      +------------------------------------------------------------------+

      |? /admin/ezstatic | admin.static? ? | Blueprint.send_static_file |

      +------------------------------------------------------------------+

      現(xiàn)在就可以使用/admin/ezstatic/訪問mystatic目錄下的靜態(tài)文件了伏伯。

      定制靜態(tài)目錄URL規(guī)則?:可以在創(chuàng)建藍(lán)圖對(duì)象時(shí)使用static_url_path來改變靜態(tài) 目錄的路由。下面的示例將為ezstatic文件夾的路由設(shè)置為/lib:

      admin = Blueprint("admin",__name__,static_folder='ezstatic',static_url_path='/lib')

      app.register_blueprint(admin,url_prefix='/admin')

      這時(shí)的路由表如下:

      +------------------------------------------------------------------+

      |? url? ? ? ? ? ? | endpoint? ? ? ? | view_function? ? ? ? ? ? ? |

      +------------------------------------------------------------------+

      |? /admin/lib? ? ? | admin.static? ? | Blueprint.send_static_file |

      +------------------------------------------------------------------+

      這樣我們可以使用地址/admin/lib/main.css訪問ezstatic目錄下的main.css文件了

      最后編輯于
      ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
      • 序言:七十年代末扭粱,一起剝皮案震驚了整個(gè)濱河市舵鳞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琢蛤,老刑警劉巖蜓堕,帶你破解...
        沈念sama閱讀 218,122評(píng)論 6 505
      • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異博其,居然都是意外死亡套才,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
        沈念sama閱讀 93,070評(píng)論 3 395
      • 文/潘曉璐 我一進(jìn)店門慕淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背伴,“玉大人,你說我怎么就攤上這事峰髓∩导牛” “怎么了?”我有些...
        開封第一講書人閱讀 164,491評(píng)論 0 354
      • 文/不壞的土叔 我叫張陵携兵,是天一觀的道長(zhǎng)疾掰。 經(jīng)常有香客問我,道長(zhǎng)徐紧,這世上最難降的妖魔是什么静檬? 我笑而不...
        開封第一講書人閱讀 58,636評(píng)論 1 293
      • 正文 為了忘掉前任,我火速辦了婚禮并级,結(jié)果婚禮上拂檩,老公的妹妹穿的比我還像新娘。我一直安慰自己嘲碧,他們只是感情好稻励,可當(dāng)我...
        茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
      • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愈涩,像睡著了一般钉迷。 火紅的嫁衣襯著肌膚如雪至非。 梳的紋絲不亂的頭發(fā)上钠署,一...
        開封第一講書人閱讀 51,541評(píng)論 1 305
      • 那天糠聪,我揣著相機(jī)與錄音,去河邊找鬼谐鼎。 笑死舰蟆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狸棍。 我是一名探鬼主播身害,決...
        沈念sama閱讀 40,292評(píng)論 3 418
      • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼草戈!你這毒婦竟也來了塌鸯?” 一聲冷哼從身側(cè)響起,我...
        開封第一講書人閱讀 39,211評(píng)論 0 276
      • 序言:老撾萬榮一對(duì)情侶失蹤唐片,失蹤者是張志新(化名)和其女友劉穎丙猬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體费韭,經(jīng)...
        沈念sama閱讀 45,655評(píng)論 1 314
      • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茧球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
        茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
      • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了星持。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抢埋。...
        茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
      • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖督暂,靈堂內(nèi)的尸體忽然破棺而出揪垄,到底是詐尸還是另有隱情,我是刑警寧澤逻翁,帶...
        沈念sama閱讀 35,684評(píng)論 5 347
      • 正文 年R本政府宣布饥努,位于F島的核電站,受9級(jí)特大地震影響卢未,放射性物質(zhì)發(fā)生泄漏肪凛。R本人自食惡果不足惜,卻給世界環(huán)境...
        茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
      • 文/蒙蒙 一辽社、第九天 我趴在偏房一處隱蔽的房頂上張望伟墙。 院中可真熱鬧,春花似錦滴铅、人聲如沸戳葵。這莊子的主人今日做“春日...
        開封第一講書人閱讀 31,894評(píng)論 0 22
      • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱烁。三九已至生蚁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戏自,已是汗流浹背邦投。 一陣腳步聲響...
        開封第一講書人閱讀 33,012評(píng)論 1 269
      • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅笔,地道東北人志衣。 一個(gè)月前我還...
        沈念sama閱讀 48,126評(píng)論 3 370
      • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猛们,于是被迫代替她去往敵國(guó)和親念脯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
        茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

      • Flask藍(lán)圖提供了模塊化管理程序路由的功能弯淘,使程序結(jié)構(gòu)清晰绿店、簡(jiǎn)單易懂。下面分析藍(lán)圖的使用方法 假如說我們要為某所...
        楓林夕陽閱讀 27,135評(píng)論 3 13
      • 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,657評(píng)論 18 139
      • 1废登,藍(lán)圖定義: Flask 用 藍(lán)圖(blueprints) 的概念來在一個(gè)應(yīng)用中或跨應(yīng)用制作應(yīng)用組件和支持通用的...
        曉可加油閱讀 831評(píng)論 0 0
      • 這樣設(shè)置后url_for('home.index'),就是www.mysite.com[http://www.my...
        曉函閱讀 2,400評(píng)論 0 3