新版本的Flask中如何啟動開發(fā)服務(wù)器和開啟調(diào)試模式

從Flask 0.11版本開始膜眠,官方就建議使用flask run命令來取代app.run()方法運行開發(fā)服務(wù)器。盡管如此账蓉,兩年多過去了肮塞,仍然有大量新發(fā)布的文章和教程在示例中使用app.run()方法啟動程序。類似的梯澜,雖然內(nèi)置的命令行支持已經(jīng)非常完善寞冯,但還有很多人在使用Flask-Script

不得不承認腊徙,在某些特殊場景下简十,app.run()更加方便,比如創(chuàng)建Flask命令在附加Werkzeug提供的性能分析中間件后啟動程序撬腾,這時通過app.run()可以直接在腳本內(nèi)啟動程序。但是在大多數(shù)情況下恢恼,flask run更能勝任啟動開發(fā)服務(wù)器的工作民傻。而且,在大型項目中,使用app.run()需要你在項目根目錄單獨創(chuàng)建一個啟動腳本漓踢,flask run則沒有這個要求牵署;在單腳本程序中,使用flask run也可以省掉腳本末尾的兩行代碼喧半。

注意 :

這兩種方法都只是用來啟動內(nèi)置(Werkzeug提供)的開發(fā)服務(wù)器奴迅,僅適用于開發(fā)用途。在生產(chǎn)環(huán)境下挺据,應(yīng)該使用性能更好取具,更加完善的開發(fā)服務(wù)器,比如Gunicorn扁耐、uWSGI等暇检。

不同組織形式的程序的啟動方式

下面我們來了解一下使用flask run啟動開發(fā)服務(wù)器時在幾種方式。

  • 簡單的單腳本程序
    如果腳本命名為app.pywsgi.py婉称,那么在包含程序腳本的目錄下直接調(diào)用flask run即可:
$ flask run

Flask會自動探測找到腳本中的程序?qū)嵗涌槠汀H绻_本命名為其他名稱,比如hello.py王暗,那么需要將腳本名寫入環(huán)境變量FLASK_APP悔据,然后再調(diào)用flask run命令:

$ export FLASK_APP=hello
$ flask run

提示 在Windows系統(tǒng)下,你需要使用set命令來設(shè)置環(huán)境變量俗壹,
比如

> set FLASK_APP=hello

后面的命令亦同科汗。

  • ①使用包組織的程序

  • ②這種情況下,可以將包含程序?qū)嵗膶?yīng)模塊的路徑寫入FLASK_APP:

$ export FLASK_APP=my_pkg.app

$ flask run

通常情況下策肝,我們會在包內(nèi)的__init__.py文件中創(chuàng)建程序?qū)嵗睾矗赃@時可以直接將包名稱寫入FLASK_APP

$ export FLASK_APP=my_pkg

$ flask run
  • ③使用工廠函數(shù)創(chuàng)建程序?qū)嵗某绦?/li>

因為Flask會自動探測程序?qū)嵗允褂霉S函數(shù)創(chuàng)建程序?qū)嵗龝r不需要進行額外設(shè)置之众。具體來說拙毫,Flask會在FLASK_APP變量存儲的對應(yīng)模塊/包構(gòu)造文件中尋找名為create_appmake_app的函數(shù),并調(diào)用這個函數(shù)來創(chuàng)建一個程序?qū)嵗?/p>

為了讓你的程序能夠被探測到棺禾,工廠函數(shù)的名稱需要命名為create_appmake_app缀蹄,而且要確保工廠函數(shù)接受默認值參數(shù)。這時啟動開發(fā)服務(wù)器的方式仍然不變:

$ export FLASK_APP=my_pkg

$ flask run

如果你的工廠函數(shù)接受的參數(shù)不是默認參數(shù)膘婶,或者你想詳細定義調(diào)用工廠函數(shù)的方式缺前,那么也可以通過FLASK_APP環(huán)境變量來定義:

$ export FLASK_APP="my_pkg:create_app('development')"

$ flask run

提示FlaskFLASK_APP還接受其他形式的輸入值,你可以參考文末給出的文檔相關(guān)部分鏈接了解完整內(nèi)容悬襟。

如何避免重復(fù)設(shè)置FLASK_APP環(huán)境變量衅码?

在上面的幾種方式中,除了包含程序?qū)嵗某绦蚰_本命名為app.pywsgi.py的情況外脊岳,都需要設(shè)置FLASK_APP環(huán)境變量逝段。有沒有辦法避免重啟電腦或是新打開命令行會話時重復(fù)輸入FLASK_APP呢垛玻?當(dāng)然。Flask提供了對一個常用的Python虛擬環(huán)境管理工具python-dotenv的支持奶躯,我們需要先安裝它:

$ pip install python-dotenv

當(dāng)python-dotenv安裝后帚桩,執(zhí)行flask run命令會首先將項目根目錄下的.env.flaskenv文件中的環(huán)境變量寫入。所以嘹黔,你可以將FLASK_APP寫在這兩個文件中账嚎。按照約定,.env存儲包含敏感數(shù)據(jù)的環(huán)境變量儡蔓,這個文件需要加入到.gitignore中以避免提交到Git倉庫中郭蕉;而.flaskenvFlask特別支持的文件,這個文件則用來存儲和Flask相關(guān)的環(huán)境變量浙值,比如FLASK_ENV恳不、FLASK_DEBUG等,所以我們可以把FLASK_APP寫到這個文件中:

FLASK_APP=my_pkg

現(xiàn)在开呐,我們可以僅通過一個命令來啟動開發(fā)服務(wù)器:

$ flask run

使用flask run時如何開啟調(diào)試模式烟勋?

在使用app.run()方法時,我們會通過將debug參數(shù)設(shè)為True來開啟調(diào)試模式筐付。而當(dāng)使用flask run時卵惦,則需要通過FLASK_ENV環(huán)境變量來設(shè)置調(diào)試模式。默認情況下瓦戚,FLASK_ENV的值為production沮尿,在開發(fā)時我們可以將其設(shè)為development來開啟調(diào)試模式。

同樣的较解,為了避免重復(fù)寫入這個環(huán)境變量畜疾,我們也將其寫到.flaskenv中:

FLASK_ENV=development

提示 目前已不推薦使用FLASK_DEBUG來開啟調(diào)試模式,當(dāng)FLASK_ENV的值為development時調(diào)試模式會自動開啟印衔。

使用flask run時如何自定義主機和端口

在通過flask run啟動開發(fā)服務(wù)器時啡捶,你可以通過命令行選項來自定義監(jiān)聽的主機和端口,示例如下:

$ flask run --port 5001

下面的示例同時指定了端口和主機:

$ flask run --host 0.0.0.0 --port 5001

另外奸焙,Flask還支持通過環(huán)境變量來定義命令選項瞎暑,支持的環(huán)境變量名稱模式為“FLASK_命令_選項”。比如与帆,如果你想設(shè)置端口了赌,那么可以定義FLASK_RUN_PORT環(huán)境變量,作用和傳入--port選項相同玄糟。

啟動包含程序上下文的Python Shell

你可以通過flask shell命令來啟動一個激活了程序上下文的Python Shell勿她,而不是使用python命令:

$ flask shell

app.run() 的未來

從0.11版本到現(xiàn)在的1.0.2版本,app.run()始終處于不建議使用狀態(tài)阵翎,而且Flask的命令行系統(tǒng)嫂拴、flask run命令的程序探測都在逐漸完善播揪,我覺得未來也許會正式”deprecate“這個app.run()方法贮喧。不過筒狠,因為某些特殊用途仍然需要使用app.run(),未來的變化還不好說箱沦。而且辩恼,Miguel Grinberg提交了這個PR讓app.run()間接調(diào)用flask run,如果這個PR被合并谓形,也許app.run()將會重回正軌灶伊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寒跳,隨后出現(xiàn)的幾起案子聘萨,更是在濱河造成了極大的恐慌,老刑警劉巖童太,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米辐,死亡現(xiàn)場離奇詭異,居然都是意外死亡书释,警方通過查閱死者的電腦和手機翘贮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爆惧,“玉大人狸页,你說我怎么就攤上這事〕对伲” “怎么了芍耘?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熄阻。 經(jīng)常有香客問我斋竞,道長,這世上最難降的妖魔是什么饺律? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任窃页,我火速辦了婚禮,結(jié)果婚禮上复濒,老公的妹妹穿的比我還像新娘脖卖。我一直安慰自己,他們只是感情好巧颈,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布畦木。 她就那樣靜靜地躺著,像睡著了一般砸泛。 火紅的嫁衣襯著肌膚如雪十籍。 梳的紋絲不亂的頭發(fā)上蛆封,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音勾栗,去河邊找鬼惨篱。 笑死,一個胖子當(dāng)著我的面吹牛围俘,可吹牛的內(nèi)容都是我干的砸讳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼界牡,長吁一口氣:“原來是場噩夢啊……” “哼簿寂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宿亡,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤常遂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挽荠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體克胳,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年坤按,在試婚紗的時候發(fā)現(xiàn)自己被綠了毯欣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡臭脓,死狀恐怖酗钞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情来累,我是刑警寧澤砚作,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嘹锁,受9級特大地震影響葫录,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领猾,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一米同、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔竿,春花似錦面粮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春柴底,著一層夾襖步出監(jiān)牢的瞬間婿脸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工柄驻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狐树,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓凿歼,卻偏偏與公主長得像褪迟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子答憔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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