新版本的Flask中如何啟動開發伺服器和開啟調試模式
來自專欄 Hello, Flask!23 人贊了文章
從Flask 0.11版本開始,官方就建議使用flask run
命令來取代app.run()
方法運行開發伺服器。儘管如此,兩年多過去了,仍然有大量新發布的文章和教程在示例中使用app.run()
方法啟動程序。類似的,雖然內置的命令行支持已經非常完善,但還有很多人在使用Flask-Script。
Added flask and the
Flask Changelog 0.11flask.cli
module to start the local debug server through the click CLI system. This is recommended over the oldflask.run()
method as it works faster and more reliable due to a different design and also replacesFlask-Script
.
不得不承認,在某些特殊場景下,app.run()
更加方便,比如創建Flask命令在附加Werkzeug提供的性能分析中間件後啟動程序,這時通過app.run()
可以直接在腳本內啟動程序。但是在大多數情況下,flask run
更能勝任啟動開發伺服器的工作。而且,在大型項目中,使用app.run()
需要你在項目根目錄單獨創建一個啟動腳本,flask run
則沒有這個要求;在單腳本程序中,使用flask run
也可以省掉腳本末尾的兩行代碼。
注意 這兩種方法都只是用來啟動內置(Werkzeug提供)的開發伺服器,僅適用於開發用途。在生產環境下,應該使用性能更好,更加完善的開發伺服器,比如Gunicorn、uWSGI等。
不同組織形式的程序的啟動方式
下面我們來了解一下使用flask run
啟動開發伺服器時在幾種方式。
- 簡單的單腳本程序
如果腳本命名為app.py
或wsgi.py
,那麼在包含程序腳本的目錄下直接調用flask run
即可:
$ flask run
Flask會自動探測找到腳本中的程序實例並啟動。如果腳本命名為其他名稱,比如hello.py
,那麼需要將腳本名寫入環境變數FLASK_APP
,然後再調用flask run
命令:
$ export FLASK_APP=hello$ flask run
提示 在Windows系統下,你需要使用set命令來設置環境變數,比如 > set FLASK_APP=hello
,後面的命令亦同。
- 使用包組織的程序
這種情況下,可以將包含程序實例的對應模塊的路徑寫入FLASK_APP
:
$ export FLASK_APP=my_pkg.app$ flask run
通常情況下,我們會在包內的__init__.py
文件中創建程序實例,所以這時可以直接將包名稱寫入FLASK_APP
:
$ export FLASK_APP=my_pkg$ flask run
- 使用工廠函數創建程序實例的程序
因為Flask會自動探測程序實例,所以使用工廠函數創建程序實例時不需要進行額外設置。具體來說,Flask會在FLASK_APP
變數存儲的對應模塊/包構造文件中尋找名為create_app
或make_app
的函數,並調用這個函數來創建一個程序實例。
為了讓你的程序能夠被探測到,工廠函數的名稱需要命名為create_app
或make_app
,而且要確保工廠函數接受默認值參數。這時啟動開發伺服器的方式仍然不變:
$ export FLASK_APP=my_pkg$ flask run
如果你的工廠函數接受的參數不是默認參數,或者你想詳細定義調用工廠函數的方式,那麼也可以通過FLASK_APP
環境變數來定義:
$ export FLASK_APP="my_pkg:create_app(development)" $ flask run
提示 Flask的FLASK_APP還接受其他形式的輸入值,你可以參考文末給出的文檔相關部分鏈接了解完整內容。
如何避免重複設置FLASK_APP環境變數?
在上面的幾種方式中,除了包含程序實例的程序腳本命名為app.py
或wsgi.py
的情況外,都需要設置FLASK_APP
環境變數。有沒有辦法避免重啟電腦或是新打開命令行會話時重複輸入FLASK_APP
呢?當然。Flask提供了對一個常用的Python虛擬環境管理工具python-dotenv
的支持,我們需要先安裝它:
$ pip install python-dotenv
當python-dotenv安裝後,執行flask run
命令會首先將項目根目錄下的.env
和.flaskenv
文件中的環境變數寫入。所以,你可以將FLASK_APP寫在這兩個文件中。按照約定,.env
存儲包含敏感數據的環境變數,這個文件需要加入到.gitignore
中以避免提交到Git倉庫中;而.flaskenv
時Flask特別支持的文件,這個文件則用來存儲和Flask相關的環境變數,比如FLASK_ENV
、FLASK_DEBUG
等,所以我們可以把FLASK_APP
寫到這個文件中:
FLASK_APP=my_pkg
現在,我們可以僅通過一個命令來啟動開發伺服器:
$ flask run
使用flask run時如何開啟調試模式?
在使用app.run()
方法時,我們會通過將debug
參數設為True
來開啟調試模式。而當使用flask run
時,則需要通過FLASK_ENV
環境變數來設置調試模式。默認情況下,FLASK_ENV
的值為production
,在開發時我們可以將其設為development
來開啟調試模式。
同樣的,為了避免重複寫入這個環境變數,我們也將其寫到.flaskenv
中:
FLASK_ENV=development
提示 目前已不推薦使用FLASK_DEBUG
來開啟調試模式,當FLASK_ENV
的值為development
時調試模式會自動開啟。
使用flask run時如何自定義主機和埠
在通過flask run啟動開發伺服器時,你可以通過命令行選項來自定義監聽的主機和埠,示例如下:
$ flask run --port 5001
下面的示例同時指定了埠和主機:
$ flask run --host 0.0.0.0 --port 5001
另外,Flask還支持通過環境變數來定義命令選項,支持的環境變數名稱模式為「FLASK_命令_選項
」。比如,如果你想設置埠,那麼可以定義FLASK_RUN_PORT
環境變數,作用和傳入--port
選項相同。
啟動包含程序上下文的Python Shell
你可以通過flask shell命令來啟動一個激活了程序上下文的Python Shell,而不是使用python命令:
$ flask shell
app.run()的未來
從0.11版本到現在的1.0.2版本,app.run()
始終處於不建議使用狀態,而且Flask的命令行系統、flask run
命令的程序探測都在逐漸完善,我覺得未來也許會正式」deprecate「這個app.run()
方法。不過,因為某些特殊用途仍然需要使用app.run()
,未來的變化還不好說。而且,Miguel Grinberg提交了這個PR讓app.run()
間接調用flask run
,如果這個PR被合併,也許app.run()
將會重回正軌。
就目前來說,flask run
要遠比app.run()
更加方便、好用、簡潔、直觀,準備好了嗎?穿上新衣服吧。
相關鏈接
- Flask文檔「程序發現」部分:Command Line Interface
- Flask Changelog:Flask Changelog - Flask 1.0.2 documentation
推薦閱讀:
※我Python 最佳實踐指南
※Cookie和Session
※Github上最受歡迎的Python輕量級框架Flask入門
※為什麼我學了Django/Flask,還是不會做Web開發?