文中涉及的示例代碼,已同步更新到HelloGitHub-Team 倉庫
在上一篇教程中,我們通過手工方式將代碼部署到了服務器。整個過程涉及到十幾條命令,輸了 N 個字符。一旦我們本地的代碼有更新,整個過程又得重復來一遍,這將變得非常繁瑣。
使用 Fabric 可以在服務器中自動執行命令。因為整個代碼部署過程都是相同的,只要我們用 Fabric 寫好部署腳本,以后就可以通過運行腳本自動完成部署了。
首先在本地安裝 Fabric:
$ pipenv install fabric --dev
因為 Fabric 只需在本地使用,因此使用 --dev 選項,讓 Pipenv 將 Fabric 依賴寫到 dev-packages 配置下,線上環境就不會安裝 Fabric。
部署過程回顧
在寫 Fabric 腳本之前,先來回顧一下當我們在本地開發環境下更新了代碼后,在服務器上的整個部署過程。
遠程連接服務器。 進入項目根目錄,從遠程倉庫拉取最新的代碼。 如果項目引入了新的依賴,需要執行 pipenv install --deploy --ignore-pipfile 安裝最新依賴。 如果修改或新增了項目靜態文件,需要執行 pipenv run python manage.py collectstatic 收集靜態文件。 如果數據庫發生了變化,需要執行 pipenv run python manage.py migrate 遷移數據庫。 重啟 Nginx 和 Gunicorn 使改動生效。整個過程就是這樣,把每一步操作翻譯成 Fabric 對應的腳本代碼,這樣一個自動化部署腳本就完成了。
完善項目配置
分離 settings 文件
為了安全,線上環境我們將 debug 改為了 False,但開發環境要改為 True,改來改去將很麻煩。此外,django 的 SECRET_KEY 是很私密的配置,django 的很多安全機制都依賴它,如果不慎泄露,網站將面臨巨大安全風險,像我們現在這樣直接寫在配置文件中,萬一不小心公開了源代碼,SECRET_KEY 就會直接泄露,好的實踐是將這個值寫入環境變量,通過從環境變量取這個值。
解決以上問題的一個方案就是拆分 settings.py 文件,不同環境對應不同的 settings 文件,django 在啟動時會從環境變量中讀取 DJANGO_SETTINGS_MODULE 的值,以這個值指定的文件作為應用的最終配置。
我們來把 settings.py 拆分,首先在 blogproject 目錄下新建一個 Python 包,名為 settings,然后創建一個 common.py,用于存放通用配置,local.py 存放開發環境的配置,production.py 存放線上環境的配置:
blogproject/ settings/ __init__.py local.py production.py settings.py
將 settings.py 文件中的內容全部復制到 common.py 里,并將 SECRET_KEY、DEBUG、ALLOWED_HOSTS 這些配置移到 local.py 和 production.py 中(common.py 中這些項可以刪除)。
開發環境的配置 local.py 內容如下:
from .common import *SECRET_KEY = 'development-secret-key'DEBUG = TrueALLOWED_HOSTS = ['*']
線上環境的配置:
from .common import *SECRET_KEY = os.environ['DJANGO_SECRET_KEY']DEBUG = FalseALLOWED_HOSTS = ['hellodjango-blog-tutorial.zmrenwu.com']
注意這里我們在頂部使用 from .common import * 將全部配置從 common.py 導入,然后根據環境的不同,在下面進行配置覆蓋。
線上環境和開發環境不同的是,為了安全,DEBUG 模式被關閉,SECRET_KEY 從環境變量獲取,ALLOWED_HOSTS 設置了允許的 HTTP HOSTS(具體作用見后面的講解)。
以上操作完成后,一定記得刪除 settings.py
。
新聞熱點
疑難解答