iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
Software Development

都是 P 開頭的程式語言,你是在 py 啥啦系列 第 19

[19] [燒瓶裡的部落格] 09. 正式部署

  • 分享至 

  • xImage
  •  

本篇的情境是你要把寫好的應用部署到伺服器上,只會就怎麼建立發行檔和安裝
不會說明要怎麼選擇伺服器,要測試的話可以另外開一個虛擬環境

並不建議直接使用這個方法進行正式環境部署
想了解在不同的主機上怎麼部署可以參考官方文件:Deployment Options

Build 和安裝

當需要把應用部署到其他地方時,需要建立一個發行文件
目前 Python 的發行標準文件是 wheel 格式的檔案,副檔名為.whl
先安裝 wheel 套件包

pip install wheel

用 Python 執行setup.py會得到用來建立發行檔的一個終端機互動工具
bdist_wheel 指令會建立一個 wheel 發行檔

python setup.py bdist_wheel

所產生的檔案為dist/flaskr-1.0.0-py3-none-any.whl
檔案名由專案名稱名稱、版本號和一些關於專案安裝要求的標記組成
像這樣:{project name}-{version}-{python tag}-{abi tag}-{platform tag}

複製這個檔案到另一台機器或是建立一個新的虛擬環境,然後用 pip 安裝這個文件

pip install flaskr-1.0.0-py3-none-any.whl

Pip 會安裝項目和相關依賴項目
既然這是一個不同的機器,就需要再次執行init-db指令,在實例資料夾中中建立資料庫

export FLASK_APP=flaskr
flask init-db

當 Flask 探測到它已被安裝(非編輯模式下)
和前面不同會使用venv/var/flaskr-instance作為實例資料夾

SECRET_KEY

在一開始__init__.py中我們給了 SECRET_KEY 一個預設值dev
但是在正式環境中我們應該使用隨機字串
否則駭客就可以使用公開金鑰的「dev」來竄改 session 和 cookie 或者其他任何使用這組金鑰的東西

可以使用下面的指令輸出一個隨機金鑰

python -c 'import os; print(os.urandom(16))'

>>> b'\t\xa2\x00\x9aax\x88\xfc\xcd\x03\x94-\xe0\xe54\xb7'

接著在實例資料夾建立一個檔案config.py
工廠會讀取這個檔案,如果檔案存在的話就把值複製進去用

venv/var/flaskr-instance/config.py

SECRET_KEY = b'\t\xa2\x00\x9aax\x88\xfc\xcd\x03\x94-\xe0\xe54\xb7'

如果有其他必須的參數設定也可以寫入該文件中,而 Flaskr 只需要SECRET_KEY

在正式伺服器執行

我們在這篇的最一開始提過,不該直接用內建的開發伺服器(flask run)部署在正式環境
開發用伺服器為了方便起見使用 Werkzeug,問題是他不是為了效能、穩定和安全而生的

應該使用正式的 WSGI 伺服器,例如 Waitress

第一步我們先在虛擬環境中安裝

pip install waitress

你要告訴 Waitree 關於你的專案,但不是像在使用flask run的時候透過FLASK_APP
而是引用並呼叫應用工廠來得到一個應用程式物件

waitress-serve --call 'flaskr:create_app'

>>> INFO:waitress:Serving on http://0.0.0.0:8080

其他還有很多不同的部署方式,不論是雲端主機或是自行架設主機的方案:Deployment Options
會選擇使用 Waitress 示範是因為他同時支援 Windows、Mac 和 Linux 系統
還有其他許多 WSGI 伺服器和部署選項可供選擇!


上一篇
[18] [燒瓶裡的部落格] 08. 撰寫測試
下一篇
[20] [燒瓶裡的部落格] 10. 心得
系列文
都是 P 開頭的程式語言,你是在 py 啥啦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言