(資料科學學習手札123)Python+Dash快速web應用開發——部署釋出篇

費弗裡發表於2021-05-29

1 簡介

   這是我的系列教程Python+Dash快速web應用開發的第二十期,在上一期中我介紹了利用內網穿透的方式,將任何可以聯網的電腦作為“伺服器”向外臨時釋出你的Dash應用。

  而內網穿透作為一種臨時展示的Dash應用釋出方式,有著很多的侷限性,尤其是在效能方面。而對於較為正式的Dash應用,自然是需要配合具有生產級別效能的web伺服器進行釋出,今天我就將介紹在windowslinux系統下,如何簡單快速地釋出你的Dash應用,適用於雲伺服器與區域網環境。

(資料科學學習手札123)Python+Dash快速web應用開發——部署釋出篇
圖1

2 利用waitress在windows中釋出Dash應用

  首先我們來介紹windows中快速釋出Dash應用的方式,我們需要用到waitress,它是一個可以在windowsunix系統中執行的具有生產級別效能的WSGI伺服器,因為Dash是基於Flask的,因此配合waitress釋出非常之方便。

  利用pip install waitress完成安裝之後,我們主要有兩種方式釋出Dash應用:

  • 方式一

  第一種方式非常簡單,是以命令列的方式進行釋出,我們以專案結構篇中搭建的七普資料看板專案為例,在app.py的同級目錄啟動終端,執行下列命令:

waitress-serve --port=8888 app:app.server

  我們就啟動了url為本地ipv4地址:8888公網ip地址:8888Dash應用,其中本地ipv4地址你可以通過在終端執行ipconfig來檢視:

(資料科學學習手札123)Python+Dash快速web應用開發——部署釋出篇
圖2

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

(資料科學學習手札123)Python+Dash快速web應用開發——部署釋出篇
圖3

  而如果你需要通過windows雲伺服器向外網釋出Dash應用,類似的訪問時把IP部分替換為公網IP即可。

  • 方式二

  waitress-server命令列的方式雖然簡單,但是它只是一種簡單需求下的快捷方式,實際上waitress設計了很多功能引數,以及配合PasteDeploylogging等其他庫來列印和記錄日誌等增廣功能,這時候就需要使用到另一種方式。

  推薦的方式是在app.py同級目錄建立wsgi.py檔案,然後在其中配置waitress服務的相關引數,譬如上文中命令列的等價方式是:

from waitress import serve
from app import app

serve(
    app.server,
    port=8888
)

  接著終端執行python wsgi.py即可,而關於serve()的更多引數,以及如何列印或記錄日誌資訊,可以參考官網文件https://docs.pylonsproject.org/projects/waitress/en/latest/arguments.htmlhttps://docs.pylonsproject.org/projects/waitress/en/latest/logging.html

3 利用gunicorn在linux中釋出Dash應用

  而當你的伺服器為linux系統時,我們有更好的web伺服器選擇——gunicorn,它移植於RubyUnicorn專案,是一個兼具簡單易用、輕量高效特點的非常流行的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引數用於指定開啟指定數量的程式來提高應用的併發效能。

(資料科學學習手札123)Python+Dash快速web應用開發——部署釋出篇
圖4

  配合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的內容見官網https://docs.gunicorn.org/en/latest/index.html


  以上就是本文的全部內容,歡迎在評論區發表你的意見和想法。

相關文章