Diango博客--18.使用 Fabric 自動化部署 Django 項目

文章目錄

    • 1.本地安裝 Fabric
    • 2.部署過程回顧
    • 3.完善項目配置
    • 4.修改 BASE_DIR 配置項
    • 5.設置 Supervisor 環境變量
    • 6.編寫 Fabric 腳本
    • 7.執行 Fabric 自動部署腳本

1.本地安裝 Fabric

$ pipenv install fabric --dev

報錯:
An error occurred while installing django-pure-pagination==0.3.0 --hash=sha256:02b42561b8afb09f1fb6ac6dc81db13374f5f748640f31c8160a374274b54713! Will try again.

在這里插入圖片描述解決辦法:將django-pure-pagenation刪除后,重新執行pipenv run python manage.py runserver重新安裝。

2.部署過程回顧

在寫 Fabric 腳本之前,先來回顧一下當我們在本地開發環境下更新了代碼后,在服務器上的整個部署過程。

  1. 遠程連接服務器。
  2. 進入項目根目錄,從遠程倉庫拉取最新的代碼。
  3. 如果項目引入了新的依賴,需要執行 pipenv install --deploy --ignore-pipfile 安裝最新依賴。
  4. 如果修改或新增了項目靜態文件,需要執行 pipenv run python manage.py collectstatic收集靜態文件。
  5. 如果數據庫發生了變化,需要執行 pipenv run python manage.py migrate 遷移數據庫。
  6. 重啟 Nginx 和 Gunicorn 使改動生效。

整個過程就是這樣,把每一步操作翻譯成 Fabric 對應的腳本代碼,這樣一個自動化部署腳本就完成了。

3.完善項目配置

1)為了安全,線上環境我們將 debug 改為了 False,但開發環境要改為 True,改來改去將很麻煩。

2)此外,django 的 SECRET_KEY 是很私密的配置,django 的很多安全機制都依賴它,如果不慎泄露,網站將面臨巨大安全風險,像我們現在這樣直接寫在配置文件中,萬一不小心公開了源代碼,SECRET_KEY 就會直接泄露,好的實踐是將這個值寫入環境變量,通過從環境變量取這個值。

3)解決以上問題的一個方案就是拆分 settings.py 文件,不同環境對應不同的 settings 文件,django 在啟動時會從環境變量中讀取 DJANGO_SETTINGS_MODULE 的值,以這個值指定的文件作為應用的最終配置。

4)我們把 settings.py 拆分,首先在 blogproject 目錄下新建一個 Python 包,名為 settings,然后創建一個 common.py,用于存放通用配置,local.py 存放開發環境的配置,production.py 存放線上環境的配置:

在這里插入圖片描述
5)將 settings.py 文件中的內容全部復制到 common.py 里,并將 SECRET_KEY、DEBUG、ALLOWED_HOSTS 這些配置移到 local.py 和 production.py 中(common.py 中這些項可以刪除)。

6)開發環境的配置 local.py 內容如下:

from .common import *SECRET_KEY = 'development-secret-key'
DEBUG = True
ALLOWED_HOSTS = ['*']

7)線上環境的配置production.py內容如下:

from .common import *SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DEBUG = False
ALLOWED_HOSTS = ['blog.fanxindong.com']

注意:

  • 這里我們在頂部使用 from .common import * 將全部配置從 common.py導入,然后根據環境的不同,在下面進行配置覆蓋。
  • 線上環境和開發環境不同的是,為了安全,DEBUG 模式被關閉,SECRET_KEY 從環境變量獲取,ALLOWED_HOSTS設置了允許的 HTTP HOSTS。
  • 以上操作完成后,一定記得刪除 settings.py。

8)對于 manage.py,通常在開發環境下執行,因此將這里的 DJANGO_SETTINGS_MODULE 的值改為 blogproject.settings.local,這樣運行開發服務器時 django 會加載 blogproject/settings/local.py 這個配置文件。
在這里插入圖片描述

9)另外看到 wsgi.py 文件中,這個文件中有一個 application,是在線上環境時 Gunicorn 加載運行的,將這里面的 DJANGO_SETTINGS_MODULE 改為 blogproject.settings.production
在這里插入圖片描述

10)這樣,在使用 manage.py 執行命令時,加載的是 local.py 的設置,而使用 gunicorn 運行項目時,使用的是 production.py 的設置。

4.修改 BASE_DIR 配置項

還有需要注意的一點,看到存放通用配置的 common.py 文件,里面有一個配置項為:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))

這個 BASE_DIR 指向項目根目錄,其獲取方式為根據所在的配置文件向上回溯,找到項目根目錄。因為此前的目錄結構為 HelloDjango-blog-tutorial/blogproject/settings.py,因此向上回溯 2 層就到達項目根目錄。而現在目錄結構變為 HelloDjango-blog-tutorial/blogproject/settings/common.py,需向上回溯 3 層才到達項目根目錄,因此需將 BASE_DIR 進行一個簡單修改,修改如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(file))))

在這里插入圖片描述
即再在外面包一層 os.path.dirname,再向上回退一層,到達項目根目錄。

5.設置 Supervisor 環境變量

由于線上環境配置中的 secret_key 從環境變量獲取,因此我們改一下 supervisor 的配置,將環境變量導入,打開 supervisor 的配置文件 ~/etc/supervisor/conf.d/HelloDjango-blog-tutorial.ini,添加環境變量的配置語句:

environment=DJANGO_SECRET_KEY=2pe8eih8oah2_2z1=7f84bzme7^bwuto7y&f(#@rgd9ux9mp-3

在這里插入圖片描述

因為此前可能將代碼傳過公開的代碼倉庫,所以最好把線上使用的 SECRET_KEY換一下。這個網站可以自動生成 SECRET_KEY:Django Secret Key Generator

保存配置,然后要執行 update 命令更新配置。
啟動:

supervisord -c ~/etc/supervisord.conf

更新:

supervisorctl -c ~/etc/supervisord.conf update

6.編寫 Fabric 腳本

Fabric 腳本通常位于 fabfile.py 文件里,因此先在項目根目錄下建一個 fabfile.py 文件。

文件位置:HelloDjango-blog-tutorial-fxd\fabfile.py

from fabric import task
from invoke import Responder
from _credentials import github_username, github_passworddef _get_github_auth_responders():"""返回 GitHub 用戶名密碼自動填充器"""username_responder = Responder(pattern="Username for 'https://github.com':",response='{}\n'.format(github_username))password_responder = Responder(pattern="Password for 'https://{}@github.com':".format(github_username),response='{}\n'.format(github_password))return [username_responder, password_responder]@task()
def deploy(c):supervisor_conf_path = '~/etc/'supervisor_program_name = 'HelloDjango-blog-tutorial-fxd'project_root_path = '~/apps/HelloDjango-blog-tutorial-fxd/'# 先停止應用with c.cd(supervisor_conf_path):cmd = 'supervisorctl stop {}'.format(supervisor_program_name)c.run(cmd)# 進入項目根目錄,從 Git 拉取最新代碼with c.cd(project_root_path):cmd = 'git pull'responders = _get_github_auth_responders()c.run(cmd, watchers=responders)# 安裝依賴,遷移數據庫,收集靜態文件with c.cd(project_root_path):c.run('pipenv install --deploy --ignore-pipfile')c.run('pipenv run python manage.py migrate')c.run('pipenv run python collectstatic --noinput')# 重新啟動應用with c.cd(supervisor_conf_path):cmd = 'supervisorctl start {}'.format(supervisor_program_name)c.run(cmd)

由于響應器從 _credentials.py 模塊導入敏感信息,因此在 fabfile.py 同級目錄新建一個 _credentials.py文件,寫上 GitHub 的用戶名和密碼:

文件位置:HelloDjango-blog-tutorial-fxd_credentials.py

github_username = your-github-username
github_password = your-github-password

當然,這個文件包含賬戶密碼等敏感信息,所以一定記得將這個文件加入 .gitignore 文件,將其排除在版本控制系統之外,別一不小心提交了公開倉庫,導致個人 GitHub 賬戶泄露。

7.執行 Fabric 自動部署腳本

進入 fabfile.py 文件所在的目錄,用 fab 命令運行這個腳本文件(將 server_ip 換為你線上服務器的 ip 地址):

fab -H server_ip --prompt-for-login-password -p deploy

這時 Fabric 會自動檢測到 fabfile.py 腳本中的 deploy 函數并運行,輸入服務器登錄密碼后回車,然后你會看到命令行輸出了一系列字符串,最后看到部署完畢的消息。

如果腳本運行中出錯,檢查一下命令行輸出的錯誤信息,修復問題后重新運行腳本即可。以后當你在本地開發完相關功能后,只需要執行這一個腳本文件,就可以自動把最新代碼部署到服務器了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

白盒測試詳解

通常把測試數據和預期的輸出結果稱為測試用例。 (一)邏輯覆蓋 是對一系列測試過程的總稱,這組測試過程逐漸進行越來越完整的通路測試。 1.語句覆蓋 語句覆蓋的含義是,選擇足夠多的測試數據,使被測程序中每個語句至少…

git 的安裝以及使用:是一個開源的分布式版本控制系統,可以對項目進行版本管理。 早期是linux之父用來管理linux系統源代碼的(linux是和windows一樣操作系統 開源免費的操作...

## 總結 - 學會使用基本的git命令 管理源代碼- 學會去github創建倉庫 并將代碼上傳到github的倉庫 (有待完成 回家有網再push)- 了解本地的.git和服務器github的.git的關系 是兩個倉庫 一個是本地 一個是服務器 需要使用一句命令來關聯 git remote add origin 遠端的.git的地址…

自斷前程,未來80%IT工作將實現自動化

技術人員革了自己的命? 在上周的Structure大會上,硅谷著名風險投資人、億萬富翁唯諾德稱未來80%的IT工作都將被AI系統所替代。不過,唯諾德好像并不擔心,相反他補充了一句“我覺得很興奮。”唯諾德表示自己并非危言聳聽&#xff0c…

2013計算機二級試題,2013全國計算機二級上機考試試題46-100套試題

*第46 套上機考試試題一、基本操作題**請根據以下各小題的要求設計Visual Basic 應用程序(包括界面和代碼)。(1)在名稱為Form1、標題為“框架練習”的窗體上*畫一個名稱為Frame1、標題為“字體”的框架控件;在框架中畫兩個單選按鈕,名稱分別為Option1、O…

黑盒測試詳解

黑盒測試著重測試軟件功能。黑盒測試并不能取代白盒測試,它是與白盒測試互補的測試方法,它很可能發現白盒測試不易發現的其他類型的錯誤。白盒測試在測試過程的早期階段進行,而黑盒測試主要用于測試過程的后期。 黑盒測試力圖發現下述類型的…

linux中rpm、yum、apt-get的關系

Linux中yum和apt-get用法及區別 一般來說著名的linux系統基本上分兩大類: 1.RedHat系列:Redhat、Centos、Fedora等 2.Debian系列:Debian、Ubuntu等 RedHat 系列 1 常見的安裝包格式 rpm包,安裝rpm包的命令是“rpm -參數” 2 包管理工具 y…

echart事件

reference: https://www.w3cschool.cn/echarts_tutorial/echarts_tutorial-7o3u28yh.html var mychart echarts.init(document.getElementById(abc)); var option {....}//忽略了具體參數 mychart.on(click,function(params){console.log(params);console.log(para…

三網融合情況下,實時語音通信技術的研究

隨著技術和標準的不斷成熟,伴隨著“三網合一”的大潮,VoIP可望成為下一代電信基礎設施結構的楊心,使未來各電信業務綜合統一在IP網絡上成為可能,導致數據的融合和未來電信市場的重組,并帶來新的經濟模式和價值鏈。 Internet在全世界范圍內的快速發展和語音信號處理技術的進步,促…

計算機操作系統指導書,《計算機操作系統》實驗指導書-2015

q.num;System.out.println(\已生產第:\個產品!\try {Thread.currentThread().sleep(100); } catch (InterruptedException e) {e.printStackTrace(); }q.notify(); }else {try {System.out.println(\ q.wait();} catch (InterruptedException e) {e.printStackTrace…

轉://Linux Multipath多路徑配置與使用案例

在Linux平臺一部分存儲產品使用操作系統自帶的多路徑軟件,包括最常見的HP和IBM的部分存儲產品,在Linux自帶的多路徑軟件叫做multipath,這篇文章以HP EVA系列存儲在Linux平臺的使用為例,詳細的在Linux平臺配置和使用多路徑。 那么問…

[原][歌曲]感動的歌曲排序

故事: 起風了  買辣椒也用券 《起風了》情感歷程 成長: 木馬城市 毛不易 男孩長大為人 感悟: 在人間  王建房 愛情: 你還要我怎樣  薛之謙   分手后的懷念 轉載于:https://www.cnblogs.com/lyggqm/p/9151124.html

C++經典書籍和相關內容

Essential C 中文版 導讀:《Essential C中文版》以4個方面來表現C的本質:procedural(程序性的)、generic(泛型的)、object-based(個別對象的)、object-oriented(面向對象…

Windows中安裝MongoDB以及studio3t

文章目錄1.安裝MongoDB2.配置并啟動MongoDB3.使用studio3t連接mongodb1.安裝MongoDB 運行 mongodb-win32-x86_64-2008plus-ssl-v3.4-latest-signed.msi 2.配置并啟動MongoDB 創建幾個文件夾具體如下: 1)數據庫路徑(data目錄) 2…

軟件可靠性

軟件可靠性是程序在給定的時間間隔內,按照規格說明書的規定成功地運行的概率。軟件可靠性隨著給定的時間間隔的加大而減少。 一般說來,對于任何其故障是可以修復的系統,都應該同時使用可靠性和可用性衡量它的優劣程度。 軟件可用性是程序在給…

為旗下硬件產品服務,LG推出基于SLAM技術的3D攝像頭

LG官方則表示,集成了LG的3D攝像頭和SLAM技術的單個模塊性價比很高。 今年3月份的時候,LG在MWC 2017上展示其和Valve合作的VR頭顯,最近他們宣布將基于AR公司Augmented Pixels的技術開發一個3D攝像頭模塊,來輔助他們的各種硬件產品…

VS工程切換cuda版本

在工程面板,切換到類視圖,選中項目,右鍵菜單選擇【生成自定義(B)…】,彈出下面窗口 在窗口勾選上CUDA版本,即可切換 轉載于:https://www.cnblogs.com/xingzhensun/p/9154094.html

揭秘Microsoft Bing與Google搜索背后的故事

導讀:Google搜索引擎已經贏得全球范圍的贊譽,而這一切都要歸功于Google開創性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后臺支持Google算法的基礎設施才是真正的幕后英雄,其基礎設施可快速的索引鏈接成千上萬臺普…

激光計算機論文,激光技術論文(2)

激光技術論文篇二激光遙感技術摘要:的 應用 是日前古 建筑和 歷史 街區保護的新契機。本文首先介紹了的原理和應用現狀;然后重點闡述了基于的古建筑保護,包括:古建筑量測、古建筑三維重建和基于三維重建古建筑保護應用;并闡述了基于激光數據的…

數據庫簡單授權機制

SQL靈活的授權機制 數據庫管理員:擁有所有對象的所有權限根據實際情況不同的權限授予不同的用戶用戶:擁有自己建立的對象的全部的操作權限可以使用GRANT,把權限授予其他用戶被授權的用戶如果具有“繼續授權”的許可,可以把獲得的權…

【bzoj1565】[NOI2009]植物大戰僵尸 【網絡流】【最大權閉合子圖】

題解:可以看出每個格子有一些前驅,只有前驅都被消滅了才能走到這里。因為要求最大的權值和,所以我們可以用最大權閉合子圖來求解這題。最大權閉合子圖點這里! 然后讓蒟蒻講一講自己掉的坑。 首先,根據WYC大佬的博客&a…