日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Diango博客--18.使用 Fabric 自动化部署 Django 项目

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Diango博客--18.使用 Fabric 自动化部署 Django 项目 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1.本地安裝 Fabric
    • 2.部署過程回顧
    • 3.完善項目配置
    • 4.修改 BASE_DIR 配置項
    • 5.設(shè)置 Supervisor 環(huán)境變量
    • 6.編寫 Fabric 腳本
    • 7.執(zhí)行 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刪除后,重新執(zhí)行pipenv run python manage.py runserver重新安裝。

2.部署過程回顧

在寫 Fabric 腳本之前,先來回顧一下當(dāng)我們在本地開發(fā)環(huán)境下更新了代碼后,在服務(wù)器上的整個部署過程。

  • 遠程連接服務(wù)器。
  • 進入項目根目錄,從遠程倉庫拉取最新的代碼。
  • 如果項目引入了新的依賴,需要執(zhí)行 pipenv install --deploy --ignore-pipfile 安裝最新依賴。
  • 如果修改或新增了項目靜態(tài)文件,需要執(zhí)行 pipenv run python manage.py collectstatic收集靜態(tài)文件。
  • 如果數(shù)據(jù)庫發(fā)生了變化,需要執(zhí)行 pipenv run python manage.py migrate 遷移數(shù)據(jù)庫。
  • 重啟 Nginx 和 Gunicorn 使改動生效。
  • 整個過程就是這樣,把每一步操作翻譯成 Fabric 對應(yīng)的腳本代碼,這樣一個自動化部署腳本就完成了。

    3.完善項目配置

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

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

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

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


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

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

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

    7)線上環(huán)境的配置production.py內(nèi)容如下:

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

    注意:

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

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

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

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

    4.修改 BASE_DIR 配置項

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

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

    這個 BASE_DIR 指向項目根目錄,其獲取方式為根據(jù)所在的配置文件向上回溯,找到項目根目錄。因為此前的目錄結(jié)構(gòu)為 HelloDjango-blog-tutorial/blogproject/settings.py,因此向上回溯 2 層就到達項目根目錄。而現(xiàn)在目錄結(jié)構(gòu)變?yōu)?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.設(shè)置 Supervisor 環(huán)境變量

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

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

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

    保存配置,然后要執(zhí)行 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/'# 先停止應(yīng)用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)# 安裝依賴,遷移數(shù)據(jù)庫,收集靜態(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')# 重新啟動應(yīng)用with c.cd(supervisor_conf_path):cmd = 'supervisorctl start {}'.format(supervisor_program_name)c.run(cmd)

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

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

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

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

    7.執(zhí)行 Fabric 自動部署腳本

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

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

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

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

    總結(jié)

    以上是生活随笔為你收集整理的Diango博客--18.使用 Fabric 自动化部署 Django 项目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。