亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Fabric自動(dòng)化部署Django項(xiàng)目的實(shí)現(xiàn)

 更新時(shí)間:2019年09月27日 14:49:43   作者:削微寒  
這篇文章主要介紹了使用Fabric自動(dòng)化部署Django項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

文中涉及的示例代碼,已同步更新到HelloGitHub-Team 倉(cāng)庫(kù)

在上一篇教程中,我們通過(guò)手工方式將代碼部署到了服務(wù)器。整個(gè)過(guò)程涉及到十幾條命令,輸了 N 個(gè)字符。一旦我們本地的代碼有更新,整個(gè)過(guò)程又得重復(fù)來(lái)一遍,這將變得非常繁瑣。

使用 Fabric 可以在服務(wù)器中自動(dòng)執(zhí)行命令。因?yàn)檎麄€(gè)代碼部署過(guò)程都是相同的,只要我們用 Fabric 寫(xiě)好部署腳本,以后就可以通過(guò)運(yùn)行腳本自動(dòng)完成部署了。

首先在本地安裝 Fabric:

$ pipenv install fabric --dev

因?yàn)?Fabric 只需在本地使用,因此使用 --dev 選項(xiàng),讓 Pipenv 將 Fabric 依賴(lài)寫(xiě)到 dev-packages 配置下,線上環(huán)境就不會(huì)安裝 Fabric。

部署過(guò)程回顧

在寫(xiě) Fabric 腳本之前,先來(lái)回顧一下當(dāng)我們?cè)诒镜亻_(kāi)發(fā)環(huán)境下更新了代碼后,在服務(wù)器上的整個(gè)部署過(guò)程。

  • 遠(yuǎn)程連接服務(wù)器。
  • 進(jìn)入項(xiàng)目根目錄,從遠(yuǎn)程倉(cāng)庫(kù)拉取最新的代碼。
  • 如果項(xiàng)目引入了新的依賴(lài),需要執(zhí)行 pipenv install --deploy --ignore-pipfile 安裝最新依賴(lài)。
  • 如果修改或新增了項(xiàng)目靜態(tài)文件,需要執(zhí)行 pipenv run python manage.py collectstatic 收集靜態(tài)文件。
  • 如果數(shù)據(jù)庫(kù)發(fā)生了變化,需要執(zhí)行 pipenv run python manage.py migrate 遷移數(shù)據(jù)庫(kù)。
  • 重啟 Nginx 和 Gunicorn 使改動(dòng)生效。

整個(gè)過(guò)程就是這樣,把每一步操作翻譯成 Fabric 對(duì)應(yīng)的腳本代碼,這樣一個(gè)自動(dòng)化部署腳本就完成了。

完善項(xiàng)目配置

分離 settings 文件

為了安全,線上環(huán)境我們將 debug 改為了 False,但開(kāi)發(fā)環(huán)境要改為 True,改來(lái)改去將很麻煩。此外,django 的 SECRET_KEY 是很私密的配置,django 的很多安全機(jī)制都依賴(lài)它,如果不慎泄露,網(wǎng)站將面臨巨大安全風(fēng)險(xiǎn),像我們現(xiàn)在這樣直接寫(xiě)在配置文件中,萬(wàn)一不小心公開(kāi)了源代碼,SECRET_KEY 就會(huì)直接泄露,好的實(shí)踐是將這個(gè)值寫(xiě)入環(huán)境變量,通過(guò)從環(huán)境變量取這個(gè)值。

解決以上問(wèn)題的一個(gè)方案就是拆分 settings.py 文件,不同環(huán)境對(duì)應(yīng)不同的 settings 文件,django 在啟動(dòng)時(shí)會(huì)從環(huán)境變量中讀取 DJANGO_SETTINGS_MODULE 的值,以這個(gè)值指定的文件作為應(yīng)用的最終配置。

我們來(lái)把 settings.py 拆分,首先在 blogproject 目錄下新建一個(gè) Python 包,名為 settings,然后創(chuàng)建一個(gè) common.py,用于存放通用配置,local.py 存放開(kāi)發(fā)環(huán)境的配置,production.py 存放線上環(huán)境的配置:

blogproject\
  settings\
    __init__.py
    local.py
    production.py
  settings.py

將 settings.py 文件中的內(nèi)容全部復(fù)制到 common.py 里,并將 SECRET_KEY、DEBUG、ALLOWED_HOSTS 這些配置移到 local.py 和 production.py 中(common.py 中這些項(xiàng)可以刪除)。

開(kāi)發(fā)環(huán)境的配置 local.py 內(nèi)容如下:

from .common import *

SECRET_KEY = 'development-secret-key'
DEBUG = True
ALLOWED_HOSTS = ['*']

線上環(huán)境的配置:

from .common import *

SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DEBUG = False
ALLOWED_HOSTS = ['hellodjango-blog-tutorial.zmrenwu.com']

注意這里我們?cè)陧敳渴褂?from .common import * 將全部配置從 common.py 導(dǎo)入,然后根據(jù)環(huán)境的不同,在下面進(jìn)行配置覆蓋。

線上環(huán)境和開(kāi)發(fā)環(huán)境不同的是,為了安全,DEBUG 模式被關(guān)閉,SECRET_KEY 從環(huán)境變量獲取,ALLOWED_HOSTS 設(shè)置了允許的 HTTP HOSTS(具體作用見(jiàn)后面的講解)。

以上操作完成后,一定記得刪除 settings.py。

現(xiàn)在我們有了兩套配置,一套是 local.py,一套是 production.py,那么啟動(dòng)項(xiàng)目時(shí),django 怎么知道我們使用了哪套配置呢?答案是在運(yùn)行 manage.py 腳本時(shí),django 默認(rèn)幫我們指定了。在使用 python manage.py 執(zhí)行命令時(shí),django 可以接收一個(gè) --settings-module 的參數(shù),用于指定執(zhí)行命令時(shí),項(xiàng)目使用的配置文件,如果參數(shù)未顯示指定,django 會(huì)從環(huán)境變量 DJANGO_SETTINGS_MODULE 里獲取??吹?manage.py 的源碼:

def main():
  os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogproject.settings')
  try:
    from django.core.management import execute_from_command_line
  except ImportError as exc:
    raise ImportError(
      "Couldn't import Django. Are you sure it's installed and "
      "available on your PYTHONPATH environment variable? Did you "
      "forget to activate a virtual environment?"
    ) from exc
  execute_from_command_line(sys.argv)

可以看到這個(gè) main 函數(shù),第一行的 setdefault 為我們?cè)O(shè)置了環(huán)境變量 DJANGO_SETTINGS_MODULE 的值,這句代碼的作用是,如果當(dāng)前環(huán)境中 DJANGO_SETTINGS_MODULE 的值沒(méi)有被設(shè)置,就將其設(shè)置為 blogproject.settings,所以我們使用 python manage.py 執(zhí)行命令時(shí),django 默認(rèn)為我們使用了 settings.py 這個(gè)配置。

所以我們可以通過(guò)設(shè)置環(huán)境變量,來(lái)指定 django 使用的配置文件。

對(duì)于 manage.py,通常在開(kāi)發(fā)環(huán)境下執(zhí)行,因此將這里的 DJANGO_SETTINGS_MODULE 的值改為 blogproject.settings.local,這樣運(yùn)行開(kāi)發(fā)服務(wù)器時(shí) django 會(huì)加載 blogproject/settings/local.py 這個(gè)配置文件。

另外看到 wsgi.py 文件中,這個(gè)文件中有一個(gè) application,是在線上環(huán)境時(shí) Gunicorn 加載運(yùn)行的,將這里面的 DJANGO_SETTINGS_MODULE 改為 blogproject.settings.production

這樣,在使用 manage.py 執(zhí)行命令時(shí),加載的是 local.py 的設(shè)置,而使用 gunicorn 運(yùn)行項(xiàng)目時(shí),使用的是 production.py 的設(shè)置。

修改 BASE_DIR 配置項(xiàng)

還有需要注意的一點(diǎn),看到存放通用配置的 common.py 文件,里面有一個(gè)配置項(xiàng)為:

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

這個(gè) BASE_DIR 指向項(xiàng)目根目錄,其獲取方式為根據(jù)所在的配置文件向上回溯,找到項(xiàng)目根目錄。因?yàn)榇饲暗哪夸浗Y(jié)構(gòu)為 HelloDjango-blog-tutorial/blogproject/settings.py,因此向上回溯 2 層就到達(dá)項(xiàng)目根目錄。而現(xiàn)在目錄結(jié)構(gòu)變?yōu)?HelloDjango-blog-tutorial/blogproject/settings/common.py,需向上回溯 3 層才到達(dá)項(xiàng)目根目錄,因此需將 BASE_DIR 進(jìn)行一個(gè)簡(jiǎn)單修改,修改如下:

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

即再在外面包一層 os.path.dirname,再向上回退一層,到達(dá)項(xiàng)目根目錄。

設(shè)置 Supervisor 環(huán)境變量

此外,由于線上環(huán)境配置中的 secret_key 從環(huán)境變量獲取,因此我們改一下 supervisor 的配置,將環(huán)境變量導(dǎo)入,打開(kāi) supervisor 的配置文件 ~/etc/supervisor/conf.d/hellodjango-blog-tutorial.ini,添加環(huán)境變量的配置語(yǔ)句:

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

因?yàn)榇饲翱赡軐⒋a傳過(guò)公開(kāi)的代碼倉(cāng)庫(kù),所以最好把線上使用的 SECRET_KEY換一下。這個(gè)網(wǎng)站可以自動(dòng)生成 SECRET_KEY:Django Secret Key Generator。

保存配置,然后要執(zhí)行 update 命令更新配置。

$ supervisorctl -c ~/etc/supervisord.conf update

編寫(xiě) Fabric 腳本

一切準(zhǔn)備工作均已就緒,現(xiàn)在就來(lái)使用 Fabric 編寫(xiě)自動(dòng)部署腳本。

Fabric 腳本通常位于 fabfile.py 文件里,因此先在項(xiàng)目根目錄下建一個(gè) fabfile.py 文件。

根據(jù)上述過(guò)程編寫(xiě)的腳本代碼如下:

from fabric import task
from invoke import Responder
from ._credentials import github_username, github_password


def _get_github_auth_responders():
  """
  返回 GitHub 用戶(hù)名密碼自動(dòng)填充器
  """
  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'

  project_root_path = '~/apps/HelloDjango-blog-tutorial/'

  # 先停止應(yīng)用
  with c.cd(supervisor_conf_path):
    cmd = 'supervisorctl stop {}'.format(supervisor_program_name)
    c.run(cmd)

  # 進(jìn)入項(xiàng)目根目錄,從 Git 拉取最新代碼
  with c.cd(project_root_path):
    cmd = 'git pull'
    responders = _get_github_auth_responders()
    c.run(cmd, watchers=responders)

  # 安裝依賴(lài),遷移數(shù)據(jù)庫(kù),收集靜態(tài)文件
  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')

  # 重新啟動(dòng)應(yīng)用
  with c.cd(supervisor_conf_path):
    cmd = 'supervisorctl start {}'.format(supervisor_program_name)
    c.run(cmd)

來(lái)分析一下部署代碼。

deploy 函數(shù)為部署過(guò)程的入口,加上 task 裝飾器將其標(biāo)注為一個(gè) fabric 任務(wù)。

然后定義了一些項(xiàng)目相關(guān)的變量,主要是應(yīng)用相關(guān)代碼和配置所在服務(wù)器的路徑。

deploy 函數(shù)被調(diào)用時(shí)會(huì)傳入一個(gè) c 參數(shù),這個(gè)參數(shù)的值是 Fabric 在連接服務(wù)器時(shí)創(chuàng)建的 ssh 客戶(hù)端實(shí)例,使用這個(gè)實(shí)例可以在服務(wù)器上運(yùn)行相關(guān)命令。

接著就是執(zhí)行一系列部署命令了,進(jìn)入某個(gè)目錄使用 ssh 客戶(hù)端實(shí)例的 cd 方法,運(yùn)行命令使用 run 方法。

需要注意的是,每次 ssh 客戶(hù)端實(shí)例執(zhí)行新的命令是無(wú)狀態(tài)的,即每次都會(huì)在服務(wù)器根目錄執(zhí)行新的命令,而不是在上一次執(zhí)行的命令所在目錄,所以要在同一個(gè)目錄下連續(xù)執(zhí)行多條命令,需要使用 with c.cd 上下文管理器。

最后,如果服務(wù)器沒(méi)有加入代碼倉(cāng)庫(kù)的信任列表,運(yùn)行 git pull 一般會(huì)要求輸入密碼。我們代碼托管使用了 GitHub,所以寫(xiě)了一個(gè) GitHub 賬戶(hù)密碼響應(yīng)器,一旦 Fabric 檢測(cè)到需要輸入 GitHub 賬戶(hù)密碼,就會(huì)調(diào)用這個(gè)響應(yīng)器,自動(dòng)填寫(xiě)賬戶(hù)密碼。

由于響應(yīng)器從 _credentials.py 模塊導(dǎo)入敏感信息,因此在 fabfile.py 同級(jí)目錄新建一個(gè) _credentials.py文件,寫(xiě)上 GitHub 的用戶(hù)名和密碼:

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

當(dāng)然,這個(gè)文件包含賬戶(hù)密碼等敏感信息,所以一定記得將這個(gè)文件加入 .gitignore 文件,將其排除在版本控制系統(tǒng)之外,別一不小心提交了公開(kāi)倉(cāng)庫(kù),導(dǎo)致個(gè)人 GitHub 賬戶(hù)泄露。

執(zhí)行 Fabric 自動(dòng)部署腳本

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

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

這時(shí) Fabric 會(huì)自動(dòng)檢測(cè)到 fabfile.py 腳本中的 deploy 函數(shù)并運(yùn)行,輸入服務(wù)器登錄密碼后回車(chē),然后你會(huì)看到命令行輸出了一系列字符串,最后看到部署完畢的消息。

如果腳本運(yùn)行中出錯(cuò),檢查一下命令行輸出的錯(cuò)誤信息,修復(fù)問(wèn)題后重新運(yùn)行腳本即可。以后當(dāng)你在本地開(kāi)發(fā)完相關(guān)功能后,只需要執(zhí)行這一個(gè)腳本文件,就可以自動(dòng)把最新代碼部署到服務(wù)器了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python標(biāo)準(zhǔn)庫(kù)之多進(jìn)程(multiprocessing包)介紹

    Python標(biāo)準(zhǔn)庫(kù)之多進(jìn)程(multiprocessing包)介紹

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)之多進(jìn)程(multiprocessing包)介紹,本文講解了進(jìn)程池、共享資源、共享內(nèi)存、Manager等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • python 進(jìn)階學(xué)習(xí)之python裝飾器小結(jié)

    python 進(jìn)階學(xué)習(xí)之python裝飾器小結(jié)

    這篇文章主要介紹了python 進(jìn)階學(xué)習(xí)之python裝飾器小結(jié),本文通過(guò)場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python中Get()函數(shù)用法舉例介紹

    Python中Get()函數(shù)用法舉例介紹

    這篇文章主要給大家介紹了關(guān)于Python中Get()函數(shù)用法的相關(guān)資料,Python get()函數(shù)是一個(gè)非常重要的函數(shù),它可以幫助我們從字典中獲取對(duì)應(yīng)鍵的值,避免了因?yàn)殒I不存在而發(fā)生錯(cuò)誤的情況,需要的朋友可以參考下
    2023-10-10
  • Pytorch 的損失函數(shù)Loss function使用詳解

    Pytorch 的損失函數(shù)Loss function使用詳解

    今天小編就為大家分享一篇Pytorch 的損失函數(shù)Loss function使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python小整數(shù)對(duì)象池和字符串intern實(shí)例解析

    Python小整數(shù)對(duì)象池和字符串intern實(shí)例解析

    這篇文章主要介紹了Python小整數(shù)對(duì)象池和字符串intern實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python?網(wǎng)易易盾滑塊驗(yàn)證功能的實(shí)現(xiàn)

    Python?網(wǎng)易易盾滑塊驗(yàn)證功能的實(shí)現(xiàn)

    這篇文章主要介紹了Python?網(wǎng)易易盾滑塊驗(yàn)證,主要是借助之前寫(xiě)阿里云盾滑塊和極驗(yàn)滑塊的經(jīng)驗(yàn)寫(xiě)的本文,通過(guò)使用selenium請(qǐng)求url,并觸發(fā)滑塊驗(yàn)證,需要的朋友可以參考下
    2022-05-05
  • Python賦值邏輯的實(shí)現(xiàn)

    Python賦值邏輯的實(shí)現(xiàn)

    本文主要介紹了 Python賦值邏輯的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • pandas dataframe添加表格框線輸出的方法

    pandas dataframe添加表格框線輸出的方法

    今天小編就為大家分享一篇pandas dataframe添加表格框線輸出的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 用 python 進(jìn)行微信好友信息分析

    用 python 進(jìn)行微信好友信息分析

    這篇文章主要介紹了用 python 進(jìn)行微信好友信息分析的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Python入門(mén)教程之pycharm安裝/基本操作/快捷鍵

    Python入門(mén)教程之pycharm安裝/基本操作/快捷鍵

    這篇文章主要介紹了Python入門(mén)教程之pycharm安裝/基本操作/快捷鍵,Python是一門(mén)非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門(mén)教程,需要的朋友可以參考下
    2023-04-04

最新評(píng)論