(數據科學學習手札123)Python+Dash快速web應用開發——部署發布篇
1 簡介
這是我的系列教程Python+Dash快速web應用開發的第二十期,在上一期中我介紹了利用內網穿透的方式,將任何可以聯網的電腦作為「伺服器」向外臨時發布你的Dash
應用。
而內網穿透作為一種臨時展示的Dash
應用發布方式,有著很多的局限性,尤其是在性能方面。而對於較為正式的Dash
應用,自然是需要配合具有生產級別性能的web伺服器進行發布,今天我就將介紹在windows
和linux
系統下,如何簡單快速地發布你的Dash
應用,適用於雲伺服器與區域網環境。

2 利用waitress在windows中發布Dash應用
首先我們來介紹windows
中快速發布Dash
應用的方式,我們需要用到waitress
,它是一個可以在windows
和unix
系統中運行的具有生產級別性能的WSGI伺服器,因為Dash
是基於Flask
的,因此配合waitress
發布非常之方便。
利用pip install waitress
完成安裝之後,我們主要有兩種方式發布Dash
應用:
- 方式一
第一種方式非常簡單,是以命令行的方式進行發布,我們以項目結構篇中搭建的七普數據看板項目為例,在app.py
的同級目錄啟動終端,執行下列命令:
waitress-serve --port=8888 app:app.server
我們就啟動了url為本地ipv4地址:8888
或公網ip地址:8888
的Dash
應用,其中本地ipv4
地址你可以通過在終端執行ipconfig
來查看:

因此區域網內的任何設備都可以通過訪問上述url來使用我們發布的Dash
應用(譬如同一WIFI下的所有設備,同一內網下的所有寬頻連接的設備):

而如果你需要通過windows
雲伺服器向外網發布Dash
應用,類似的訪問時把IP部分替換為公網IP即可。
- 方式二
waitress-server
命令行的方式雖然簡單,但是它只是一種簡單需求下的快捷方式,實際上waitress
設計了很多功能參數,以及配合PasteDeploy
和logging
等其他庫來列印和記錄日誌等增廣功能,這時候就需要使用到另一種方式。
推薦的方式是在app.py
同級目錄建立wsgi.py
文件,然後在其中配置waitress
服務的相關參數,譬如上文中命令行的等價方式是:
from waitress import serve
from app import app
serve(
app.server,
port=8888
)
接著終端執行python wsgi.py
即可,而關於serve()
的更多參數,以及如何列印或記錄日誌資訊,可以參考官網文檔//docs.pylonsproject.org/projects/waitress/en/latest/arguments.html
、//docs.pylonsproject.org/projects/waitress/en/latest/logging.html
。
3 利用gunicorn在linux中發布Dash應用
而當你的伺服器為linux
系統時,我們有更好的web伺服器選擇——gunicorn
,它移植於Ruby
的Unicorn
項目,是一個兼具簡單易用、輕量高效特點的非常流行的WSGI伺服器,但只能運行於Unix
系統中,因此前面介紹windows
系統部署方法就沒有提到它。
用gunicorn
來發布Dash
應用也是非常簡單高效,比如dash-bootstrap-components
的官網文檔就使用它進行發布的。
類似的,利用pip install gunicorn
完成安裝之後,只需要一行命令我們就可以架起Dash
應用, 與上文waitress
略有不同的是,我們需要在app.py
中對server.py
中的server
對象進行導入,接著再執行下列gunicorn
命令:
gunicorn -w 4 -b 0.0.0.0:8888 app:server
就成功地在linux
伺服器上發布了Dash
應用,同樣可以通過公網和區域網IP進行訪問,其中-w
參數用於指定開啟指定數量的進程來提高應用的並發性能。

配合nohup
我們可以輕鬆地將gunicorn
命令置於後台執行,不會阻塞終端,如:
nohup gunicorn -w 4 -b 0.0.0.0:8888 app:server &
而如果想要關閉後台運行在某個埠號下的所有gunicorn
進程,執行kill $(lsof -i:埠號|awk '{if(NR==2)print $2}')
命令即可一步到位。
同樣地gunicorn
也擁有很多功能參數,常用的有--access-logfile
來指定向外書寫日誌文件,-t
用於設定請求的超時秒數閾值,默認為30秒,當你的Dash
應用某個回調執行的計算時間很長時,請務必記住手動設置提升該參數的數值。
更多有關gunicorn
的內容見官網//docs.gunicorn.org/en/latest/index.html
。
以上就是本文的全部內容,歡迎在評論區發表你的意見和想法。