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.mzph.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…