從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.py
或wsgi.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_app
或make_app
的函數(shù),并調(diào)用這個函數(shù)來創(chuàng)建一個程序?qū)嵗?/p>
為了讓你的程序能夠被探測到棺禾,工廠函數(shù)的名稱需要命名為create_app
或make_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
提示Flask的FLASK_APP
還接受其他形式的輸入值,你可以參考文末給出的文檔相關(guān)部分鏈接了解完整內(nèi)容悬襟。
如何避免重復(fù)設(shè)置FLASK_APP環(huán)境變量衅码?
在上面的幾種方式中,除了包含程序?qū)嵗某绦蚰_本命名為app.py
或wsgi.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倉庫中郭蕉;而.flaskenv
時Flask
特別支持的文件,這個文件則用來存儲和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()將會重回正軌灶伊。