《Flask 入門教程》第 11 章:部署上線
在這個教程的最後一章,我們將會把程式部署到網際網路上,讓網路中的其他所有人都可以訪問到。
Web 程式通常有兩種部署方式:傳統部署和雲部署。傳統部署指的是在使用物理主機或虛擬主機上部署程式,你通常需要在一個 Linux 系統上完成所有的部署操作;雲部署則是使用其他公司提供的雲平臺,這些平臺為你設定好了底層服務,包括 Web 伺服器、資料庫等等,你只需要上傳程式碼並進行一些簡單設定即可完成部署。這一章我們會介紹使用雲平臺PythonAnywhere 來部署程式。
部署前的準備
對於某些配置,生產環境下需要使用不同的值。為了讓配置更加靈活,我們把需要在生成環境下使用的配置改為優先從環境變數中讀取,如果沒有讀取到,則使用預設值:
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev') app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(os.path.dirname(app.root_path), os.getenv('DATABASE_FILE', 'data.db'))
以第一個配置變數為例, os.getenv('SECRET_KEY', 'dev')
表示讀取系統環境變數 SECRET_KEY
的值,如果沒有獲取到,則使用 dev
。
注意 像金鑰這種敏感資訊,儲存到環境變數中要比直接寫在程式碼中更加安全。
對於第二個配置變數,我們僅改動了最後的資料庫檔名。在示例程式裡,因為我們部署後將繼續使用 SQLite,所以只需要為生產環境設定不同的資料庫檔名,否則的話,你可以像金鑰一樣設定優先從環境變數讀取整個資料庫 URL。
在部署程式時,我們不會使用 Flask 內建的開發伺服器執行程式,因此,對於寫到 .env 檔案的環境變數,我們需要手動使用 python-dotenv 匯入。下面在專案根目錄建立一個 wsgi.py 指令碼,在這個指令碼中載入環境變數,並匯入程式例項以供部署時使用:
wsgi.py:手動設定環境變數並匯入程式例項
import os from dotenv import load_dotenv dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path) from watchlist import app
這兩個環境變數的具體定義,我們將在遠端伺服器環境建立新的 .env 檔案寫入。
最後讓我們把改動提交到 Git 倉庫,並推送到 GitHub 上的遠端倉庫:
$ git add . $ git commit -m "Ready to deploy" $ git push
使用 PythonAnywhere 部署程式
首先訪問註冊頁面註冊一個免費賬戶。註冊時填入的使用者名稱將作為你的程式域名的子域部分,以及分配給你的 Linux 使用者名稱。比如,如果你的使用者名稱為 greyli,最終為你分配的程式域名就是 http:// greyli.pythonanywhere.com / 。
註冊完成後會有一個簡單的教程,你可以跳過,也可以跟著瞭解一下基本用法。管理面板主頁如下所示:

導航欄包含幾個常用的連結,可以開啟其他面板:
- Consoles(控制檯):可以開啟 Bash、Python Shell、MySQL 等常用的控制檯
- Files(檔案):建立、刪除、編輯、上傳檔案,你可以在這裡直接修改程式碼
- Web:管理 Web 程式
- Tasks(任務):建立計劃任務
- Databases(資料庫):設定資料庫,免費賬戶可以使用 MySQL
這些連結對應頁面的某些功能也可以直接在管理面板主頁開啟。
我們需要先來建立一個 Web 程式,你可以點選導航欄的 Web 連結,或是主頁上的“Open Web tab”按鈕開啟 Web 面板:

點選“Add a new web app”按鈕建立 Web 程式,第一步提示升級賬戶後可以自定義域名,我們直接點選“Next”按鈕跳到下一步:

這一步選擇 Web 框架,為了獲得更靈活的控制,選擇手動設定(Manual configuration):

接著選擇你想使用的 Python 版本:

最後點選“Next”按鈕即可完成建立 Web 程式流程:

接下來我們需要進行一系列程式初始化操作,最後再回到 Web 面板進行具體的設定。
初始化程式執行環境
我們首先要考慮把程式碼上傳到 PythonAnywhere 的伺服器上。上傳程式碼一般有兩種方式:
- 從 GitHub 拉取我們的程式
- 在本地將程式碼儲存為壓縮檔案,然後在 Files 標籤頁上傳壓縮包
因為我們的程式碼已經推送到 GitHub 上,這裡將採用第一種方式。首先通過管理面板主頁的“Bash”按鈕或是 Consoles 面板下的“Bash”連結建立一個命令列會話:

在命令列下輸入下面的命令:
$ pip3 install --user pipenv# 安裝 Pipenv $ git clone https://github.com/greyli/watchlist# 注意替換 Git 倉庫地址 $ cd watchlist# 切換程序序倉庫
這會把程式程式碼克隆到 PythonAnywhere 為你分配的使用者目錄中,路徑即 /home/你的 PythonAnywhere 使用者名稱/你的參倉庫名
,比如 /home/greyli/watchlist
。
注意替換 git clone 命令後的 Git 地址,將 greyli
替換為你的 GitHub 使用者名稱,將 watchlist
替換為你的倉庫名稱。
提示 如果你使用 Python 2.7,那麼需要使用 pip 來執行安裝 Pipenv 的命令;開啟 Python Shell 時使用 python 命令,而不是 python3。
提示 如果你在 GitHub 上的倉庫型別為私有倉庫,那麼需要將 PythonAnywhere 伺服器的 SSH 金鑰新增到 GitHub 賬戶中,具體參考第 1 章“設定 SSH 金鑰”小節。
下面我們在專案根目錄建立 .env 檔案,並寫入生產環境下需要設定的兩個環境變數。其中,金鑰( SECRET_KEY
)的值是隨機字串,我們可以使用 uuid 模組來生成:
$ python3 >>> import uuid >>> uuid.uuid4().hex '3d6f45a5fc12445dbac2f59c3b6c7cb1'
複製生成的隨機字元備用,接著建立 .env 檔案:
$ nano .env
寫入設定金鑰和資料庫名稱的環境變數:
SECRET_KEY=3d6f45a5fc12445dbac2f59c3b6c7cb1 DATABASE_FILE=data-prod.db
最後安裝依賴並執行初始化操作:
$ pipenv install# 建立虛擬環境並安裝依賴 $ pipenv shell# 啟用虛擬環境 $ flask initdb# 初始化資料庫 $ flask admin# 建立管理員賬戶
先不要關閉這個標籤頁,後面我們還要在這裡執行一些命令。點選右上角的選單按鈕,並在瀏覽器的新標籤頁開啟 Web 面板。
設定並啟動程式
程式碼部分我們已經設定完畢,接下來進行一些簡單設定就可以啟動程式了。
程式碼
回到 Web 標籤頁,先來設定 Code 部分的配置:

點選原始碼(Source code)和工作目錄(Working directory)後的路徑並填入專案根目錄,目錄規則為“/home/使用者名稱/專案資料夾名”。
點選 WSGI 配置檔案(WSGI configuration file)後的連結開啟編輯頁面,刪掉這個檔案內的所有內容,填入下面的程式碼:
import sys path = '/home/watchlist/watchlist' if path not in sys.path: sys.path.append(path) from wsgi import app as application
完成後點選綠色的 Save 按鈕或按下 Ctrl+S 儲存修改,點選右上角的選單按鈕返回 Web 面板。
PythonAnywhere 會自動從這個檔案裡匯入名稱為 application
的程式例項,所以我們從專案目錄的 wsgi 模組中匯入程式例項 app
,並將名稱對映為 application
。
虛擬環境
為了讓程式正確執行,我們需要在 Virtualenv 部分填入虛擬環境資料夾的路徑:

使用 Pipenv 時,你可以在專案根目錄下使用下面的命令獲取當前專案對應的虛擬環境資料夾路徑(返回前面開啟的命令列會話輸入下面的命令):
$ pipenv --venv
複製輸出的路徑,點選 Virtualenv 部分的紅色字型連結,填入並儲存。
靜態檔案
靜態檔案可以交給 PythonAnywhere 設定的伺服器來處理,這樣會更高效。要讓 PythonAnywhere 處理靜態檔案,我們只需要在 Static files 部分指定靜態檔案 URL 和對應的靜態檔案資料夾目錄,如下所示:

注意更新目錄中的使用者名稱和專案資料夾名稱。
啟動程式
一切就緒,點選綠色的過載按鈕即可讓配置生效:

現在訪問你的程式網址“ https://使用者名稱.pythonanywhere.com”(Web 面板頂部的連結),比如 https://greyli.pythonanywhere.com 即可訪問程式。
最後還要注意的是,免費賬戶需要每三個月點選一次黃色的啟用按鈕(在過期前你會收到提醒郵件):

更新部署後的程式
當你需要更新程式時,流程和部署類似。在本地完成更新,確保程式通過測試後,將程式碼推送到 GitHub 上的遠端倉庫。登入到 PythonAnywhere,開啟一個命令列會話(Bash),切換到專案目錄,使用 git pull 命令從遠端倉庫拉取更新:
$ cd watchlist $ git pull
然後你可以執行一些必要的操作,比如安裝新的依賴等等。最後在 Web 面板點選綠色的過載(Reload)按鈕即可完成更新。
本章小結
程式部署上線以後,你可以考慮繼續為它開發新功能,也可以從零編寫一個新的程式。雖然本書即將接近尾聲,但你的學習之路才剛剛開始,因為本書只是介紹了 Flask 入門所需的基礎知識,你還需要進一步學習。在後記中,你可以看到進一步學習的推薦讀物。接下來,有一個挑戰在等著你。
進階提示
- 因為 PythonAnywhere 支援線上管理檔案、編輯程式碼、執行命令,你可以在學習程式設計的過程中使用它來線上開發 Web 程式。
- PythonAnywhere 的 Web 面板還有一些功能設定:Log files 部分可以檢視你的程式日誌,Traffic 部分顯示了你的程式訪問流量情況,Security 部分可以為你的程式程式開啟強制啟用 HTTPS 和密碼保護。
- 《Flask Web 開發實戰》 第 14 章詳細介紹了部署 Flask 程式的兩種方式,傳統部署和雲部署。
- 本書主頁 & 相關資源索引: http:// helloflask.com/tutorial 。