Flask框架——藍(lán)圖屯蹦、flask-script

在上篇文章我們學(xué)習(xí)了Flask框架——模板復(fù)用(繼承、包含绳姨、宏)登澜,這篇文章我們來(lái)學(xué)習(xí)Flask框架——藍(lán)圖、命令行工具flask-script飘庄。

藍(lán)圖

在一個(gè)完整的Flask應(yīng)用程序中脑蠕,肯定會(huì)有很多視圖函數(shù),例如:用Flask框架寫(xiě)的購(gòu)物網(wǎng)站中跪削,會(huì)有和用戶谴仙、商品、評(píng)論相關(guān)聯(lián)的視圖函數(shù)碾盐,把所有視圖函數(shù)都放在一個(gè)py文件中肯定是不可取的晃跺,管理起來(lái)會(huì)非常不方便。

這時(shí)我們可以把視圖函數(shù)進(jìn)行模塊化處理毫玖,把用戶視圖函數(shù)掀虎、商品視圖函數(shù)、評(píng)論視圖函數(shù)分為用戶模塊付枫、商品模塊和評(píng)論模塊烹玉。Flask框架內(nèi)置了一個(gè)模塊化處理的類——Blueprint藍(lán)圖。

Blueprint藍(lán)圖是一種組織一組相關(guān)視圖及其他代碼的方式阐滩。與把視圖及其他代碼直接注冊(cè)到應(yīng)用的方式不同二打,藍(lán)圖方式是把它們注冊(cè)到藍(lán)圖,然后在工廠函數(shù)中把藍(lán)圖注冊(cè)到應(yīng)用掂榔。

簡(jiǎn)單來(lái)說(shuō)就把視圖函數(shù)按功能分為很多個(gè)小模塊继效,這些小模塊調(diào)用Blueprint類后稱為藍(lán)圖症杏,一般情況下,我們都是把藍(lán)圖放在包里莲趣,把藍(lán)圖注冊(cè)到app應(yīng)用中鸳慈,這樣就實(shí)現(xiàn)了模塊化處理,如下圖所示:



接下來(lái)我們通過(guò)Flask項(xiàng)目來(lái)演示如何使用創(chuàng)建喧伞、使用藍(lán)圖走芋。

創(chuàng)建Flask項(xiàng)目目錄如下所示:



這里創(chuàng)建一個(gè)apps包,在apps包中我們創(chuàng)建了goods潘鲫、user包分別用來(lái)存放goods視圖函數(shù)文件和user視圖函數(shù)文件翁逞。

用user包為例,在user包中創(chuàng)建名為view的py文件溉仑,該文件用來(lái)編寫(xiě)視圖函數(shù)挖函,view.py示例代碼如下所示:

from flask import Blueprint
user_bp= Blueprint('user',__name__)     #藍(lán)圖實(shí)例化對(duì)象

@user_bp.route('/hello')            #路由裝飾器  
def hello_world():                  #視圖函數(shù)
    return 'hello world'            #返回hello world字符串

使用Blueprint()方法獲取到藍(lán)圖對(duì)象user_bp,和之間的Flask程序路由裝飾器不同浊竟,該路由裝飾器為:

藍(lán)圖實(shí)例化對(duì)象.route()

注意:apps包的init.py初始化文件與static靜態(tài)文件夾怨喘、templates模板文件夾不在同一級(jí),所以需要在Blueprint()方法中傳遞template_folder和static_folder參數(shù)振定,告訴該視圖函數(shù)在哪里找靜態(tài)文件夾和模板文件夾必怜,代碼如下所示:

user_bp= Blueprint('user',__name__,template_folder='../templates',static_folder='../static')

但一般來(lái)說(shuō),我們不會(huì)在Blueprint()方法中傳遞template_folder和static_folder后频,一般在apps包中的init.py初始化文件中傳入template_folder和static_folder參數(shù)梳庆,示例代碼如下所示:

from flask import Flask
from apps.user.view import user_bp

def create_app():
    #設(shè)置靜態(tài)文件夾和模板文件夾的路徑
    app=Flask(__name__,template_folder='../templates',static_folder='../static')
    app.register_blueprint(user_bp)     #注冊(cè)藍(lán)圖
    return app              #返回Flask對(duì)象

在init.py初始化文件中自定義一個(gè)create_app()方法,并在方法中使用Flask卑惜,獲取Flask類實(shí)例對(duì)象app膏执,這樣我們就不需要在啟動(dòng)文件app.py文件中使用Flask,啟動(dòng)app.py文件就很簡(jiǎn)潔了露久,使用register_blueprint()方法注冊(cè)藍(lán)圖更米。

啟動(dòng)文件app.py代碼如下所示:

from apps import create_app

app=create_app()            #調(diào)用init.py初始文件的create_app()方法

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

啟動(dòng)文件很簡(jiǎn)潔,就調(diào)用create_app()和一個(gè)啟動(dòng)run()方法毫痕。

啟動(dòng)Flask項(xiàng)目壳快,訪問(wèn)http://127.0.0.1:5000/hello,網(wǎng)頁(yè)就會(huì)顯示hello world镇草。

這樣我們就成功使用了藍(lán)圖。

flask-script

flask-script是一個(gè)支持自定義命令的工具瘤旨,為Flask程序添加了一個(gè)命令行解析器梯啤,可以讓程序從命令行直接執(zhí)行相應(yīng)的程序。

flask-script支持在Flask中編寫(xiě)外部腳本存哲,這包括運(yùn)行開(kāi)發(fā)服務(wù)器因宇、定制python-shell七婴、設(shè)置數(shù)據(jù)庫(kù)的腳本、cronjobs和其他屬于web應(yīng)用程序本身之外的命令行任務(wù)察滑。

其安裝方式如下所示:

pip install flask-script

將flask-script繼承在Flask項(xiàng)目app.py中打厘,其代碼如下所示:

from flask import Flask
from flask_script import Manager            #導(dǎo)入Manager方法

app = Flask(__name__)

manager = Manager(app)      # 將命令行綁定在app應(yīng)用中

@app.route('/')
def index():
    return 'hello world'

if  __name__ == "__main__"
    manager.run()

我們依舊在命令行中執(zhí)行下面代碼來(lái)啟動(dòng)flask程序的app,代碼如下所示:

app.py

運(yùn)行結(jié)果如下圖所示:



我們發(fā)現(xiàn)flask程序沒(méi)有被啟動(dòng)贺辰,這是因?yàn)槭裁茨兀?/p>

運(yùn)行結(jié)果圖中的大概意思是執(zhí)行代碼app.py中后面缺少了一些命令户盯,這些命令可以是shell、runserver饲化,也可以通過(guò)--help來(lái)獲取命令的幫助莽鸭。其中:

  • shell:在Flask程序中運(yùn)行一個(gè)Python腳本;
  • runserver:?jiǎn)?dòng)flask程序服務(wù)器吃靠。

由于我們通過(guò)Manager()方法將命令行綁定在app應(yīng)用中硫眨,所以需要命令行執(zhí)行下面代碼來(lái)啟動(dòng)flask程序:

app.py runserver

運(yùn)行結(jié)果如下所示:



這樣就成功啟動(dòng)了flask程序了,接下來(lái)我們看看app.py runserver后面還可以接什么命令巢块,如下圖所示:



在app.py runserver后面可以接以下命令:
[-?] [-h HOST] [-p PORT] [--threaded] [--processes PROCESSES] [--passthrough-errors] [-d] [-D] [-r] [-R] [--ssl-crt SSL_CRT] [--ssl-key SSL_KEY]

這里就不一一解釋每個(gè)命令的作用了礁阁。

我們舉個(gè)簡(jiǎn)單的例子,修改flask服務(wù)的端口號(hào)族奢,命令行執(zhí)行代碼如下所示:

app.py runserver -p 8080

這樣就成功修改了flask服務(wù)的端口號(hào)姥闭。

除了flask-script自帶的shell,runserver命令之外歹鱼,我們還可以自定義flask-script命令泣栈,其代碼如下所示:

from flask import Flask
from flask_script import Manager

app = Flask(__name__)

manager=Manager(app)

@manager.command
def welcome():              #自定義flask-script
    print('welcome')

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

這里我們通過(guò)manager.command()來(lái)添加welcome到flask-scrip命令中,命令行輸入app.py弥姻,如下圖所示:



我們發(fā)現(xiàn)在圖中多了welcome這個(gè)命令南片,命令行執(zhí)行app.py welcome,如下圖所示:



這樣就成功自定義命令了庭敦。

好了疼进,F(xiàn)lask框架——藍(lán)圖、命令行工具flask-script就講到這里了秧廉,下篇文章學(xué)習(xí)Flask框架——數(shù)據(jù)庫(kù)配置及遷移同步伞广,感謝觀看!L鄣纭嚼锄!
公眾號(hào):白巧克力LIN

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蔽豺,隨后出現(xiàn)的幾起案子区丑,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沧侥,死亡現(xiàn)場(chǎng)離奇詭異可霎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宴杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)癣朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旺罢,你說(shuō)我怎么就攤上這事旷余。” “怎么了主经?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵荣暮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我罩驻,道長(zhǎng)穗酥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任惠遏,我火速辦了婚禮砾跃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘节吮。我一直安慰自己抽高,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布透绩。 她就那樣靜靜地躺著翘骂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帚豪。 梳的紋絲不亂的頭發(fā)上碳竟,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音狸臣,去河邊找鬼莹桅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烛亦,可吹牛的內(nèi)容都是我干的诈泼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼煤禽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铐达!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起檬果,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娶桦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體衷畦,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年知牌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祈争。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡角寸,死狀恐怖菩混,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扁藕,我是刑警寧澤沮峡,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站亿柑,受9級(jí)特大地震影響邢疙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜望薄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一疟游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痕支,春花似錦颁虐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至花嘶,卻和暖如春笋籽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背察绷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工干签, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拆撼。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓容劳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闸度。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竭贩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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