Django项目上线与部署


项目上线与部署

​ 目前,部署Django项目有两种主流方案:Nginx+uWSGI+Django和Apache+uWSGI+Django。Nginx或Apache作为服务器最前端,负责接收浏览器所有的HTTP请求并统一管理。静态资源的HTTP请求由Nginx或Apache自己处理;非静态资源的HTTP请求则由Nginx或Apache传递给uWSGI服务器,然后传递给Django应用,最后由Django进行处理并做出响应,从而完成一次Web请求。不同的计算机操作系统,Django的部署方法有所不同,随着技术的发展,Django的项目部署方式趋向多元化发展,比如Docker、云服务器和云部署平台等,使项目部署变得更加简单和快捷,本章讲述Django如何部署在Linux系统中。

自定义异常页面

​ 网站异常是一个普遍存在的问题,常见的异常以404或500为主。出现异常主要是网站自身的数据缺陷或者不合理的非法访问所导致的。比如商城网址为127.0.0.1:8000/commodity/details.html,该网站在项目babys中没有定义相应的路由信息,当用户访问不存在的网址时,网站应抛出404异常。

​ 我们在项目的模板文件夹templates已放置了模板文件404.html,模板文件404.html作为404或500的异常页面。首先在babys的urls.py中定义404或500的路由信息,代码如下:

​ 从404或500的路由信息看到,路由的HTTP请求分别由视图函数page_not_found和page_error负责接收和处理。我们在项目应用index的views.py中定义404和500的视图函数,代码如下:

视图函数page_not_found和page_error使用模板文件404.html生成异常页面,我们在模板文件404.html中编写异常页面的HTML代码,代码如下:

​ 模板文件404.html引入CSS样式文件style.css和JS脚本文件parallax.min.js、jquery.min.js和script.js,然后使用静态图片文件夹svg的图片文件作为页面内容,使网页具有动态效果,如图11-1所示。

项目上线部署配置

​ 由于项目babys还处于开发调试模式,即使定义了404页面,但在开发调试模式下依然无法访问404页面,因为开发调试模式下的404页面会自动提示当前程序的异常信息。如果将网站部署在正式服务器中并且还处于开发调试模式,用户在访问不存在的页面或网站出现异常的时候,网站会把异常信息显示在网页上,这样就泄露了网站的部分代码,很容易遭到网络攻击。

​ 当项目完成开发阶段并准备上线部署的时候,我们需要将项目的开发调试模式改为上线模式,首先在项目的settings.py中设置配置属性DEBUG和ALLOWED_HOSTS,同时添加配置属性STATIC_ROOT,配置信息如下:

​ 配置属性STATIC_ROOT指向项目的static文件夹,但创建项目的时候,我们并没有在项目中创建static文件夹,只是创建了静态资源文件夹pstatic。因为项目的static文件夹可以使用Django内置指令collectstatic创建,在PyCharm的Terminal中输入collectstatic指令,如图11-2所示。

​ 在PyCharm中打开项目的static文件夹,发现它复制了静态资源文件夹pstatic里面的所有静态资源,并且还复制了Admin后台系统的静态资源,如图11-3所示。

现在项目中存在两个静态文件夹,第一个是项目的pstatic文件夹,第二个是项目的static文件夹。Django根据不同的运行模式读取不同的静态文件夹。这种设计方案已兼顾Django的两种运行模式,每次切换运行模式只需改变配置属性DEBUG的值即可,详细说明如下:

(1)如果将Django设为调试模式(DEBUG=True),那么项目运行时将读取项目的pstatic文件夹的静态资源。

(2)如果将Django设为上线模式(DEBUG=False),那么项目运行时将读取项目的static文件夹的静态资源。当Django设为上线模式时,它不再提供静态资源服务,该服务应交由服务器来完成,因此在项目的路由列表中添加静态资源的路由信息,让Django知道如何找到静态资源文件,否则无法在浏览器上访问static文件夹的静态资源信息,路由信息如下:

​ 当Django设为上线模式时,它不再提供静态资源服务,该服务应交由服务器来完成,因此在项目的路由列表中添加静态资源的路由信息,让Django知道如何找到静态资源文件,否则无法在浏览器上访问static文件夹的静态资源信息,路由信息如下:

综上所述,设置Django项目上线模式的操作步骤如下:

(1)在项目的settings.py中设置配置属性STATIC_ROOT,该配置指向整个项目的静态资源文件夹,然后修改配置属性DEBUG和ALLOWED_HOSTS。

(2)使用collectstatic指令收集整个项目的静态资源,这些静态资源将存放在配置属性STATIC_ROOT设置的文件路径下。

(3)在项目的urls.py中添加静态资源的路由信息,让Django知道如何找到静态资源文件。

基于Linux部署Django

​ Linux操作系统没有内置服务器功能,若想将Django项目部署在Linux系统,则可以选择安装Nginx或Apache服务器。本节以Nginx服务器为例,讲述如何将Django项目部署在Linux系统中。

安装Python 3

​ CentOS 7系统默认安装Python 2.7版本,但Django 2.0之后不再支持Python 2.7版本,因此我们需要在CentOS 7系统中安装Python 3版本。本节主要讲述如何在CentOS 7系统中安装Python 3.8。在安装Python 3.8之前,我们分别需要安装Linux的wget工具、GCC编译器环境以及Python 3使用的依赖组件,相关的安装指令如下:

​ 完成依赖组件的安装后,使用wget指令在Python官网下载Python 3.8压缩包,在CentOS 7系统输入下载指令wget “https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz”。下载完成后,可以在当前路径查看下载的内容。下一步对压缩包进行解压,在当前路径下输入解压指令tar -zxvf Python-3.8.2.tgz。当解压完成后,在当前路径下会出现Python-3.8.2文件夹。Python-3.8.2文件夹是我们需要的开发环境,里面包含Python 3.8版本所需的组件。最后将Python-3.8.2编译到CentOS 7系统,编译指令如下:

wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
tar -xvf Python-3.8.2.tgz
cd  Python-3.8.2
./configure
make 
make install

​ 编译完成后,我们在CentOS 7系统中输入指令python3,即可进入Python交互模式,则说明在CentOS 7中成功地安装了Python 3.8。

​ 下一步使用FileZilla工具软件将本地系统的项目babys转移到虚拟系统CentOS 7,项目babys存放在虚拟系统的home文件夹中。

部署MySQL数据库

注意:需要提前完成网络配置,能够正常连接网络,以下所有操作都是使用root用户进行;

1.安装官方Yum源

wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

rpm -ivh mysql57-community-release-el7-9.noarch.rpm

2.安装与启动MySQL-Server

yum -y install mysql-server

systemctl start mysqld

3.MySQL密码设置

# 1.获取临时密码

cat /var/log/mysqld.log  |grep "password" | cut -d":" -f4
### 例如: S2qqhpUoY;7i

# 2.跳过MySQL的密码认证过程
vim /etc/my.cnf
# 按i进入编辑模式
skip-grant-tables
# 在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程,
# 使用 [Esc]:wq  退出vim编辑器
# 重启mysql
systemctl restart mysqld

# 3.登入MySQL
mysql -uroot -p
# 输入密码

# 4.修改密码

Use mysql;
# 缓存写入磁盘
flush privileges;
# 修改root密码为'root123'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';
# 退出
\q;

# 5.修改MySQL的密码认证过程和修改字符集
vim /etc/my.cnf
# 注释掉之前添加的 skip-grant-tables
# skip-grant-tables
# 将服务端字符集修改为utf8mb4以更好的支持中文
character-set-server=utf8mb4

# 6.重启mysql
systemctl restart mysqld

# 7.设置为开启自动启动MySQL-Server
systemctl enable mysqld

4.开启远程控制

# 1.登录
mysql -uroot -proot123

# 2.修改登录地址
use mysql;
# % 表示任意地址都可以登录
update user set Host='%' where User='root';
# 刷新缓存
flush privileges;
# 退出
\q;

同步babys库

mysql -uroot -p000000

create database babys charset utf8mb4;
\q;
# 将项目中的 babys.sql导入到项目中
mysql -uroot  -p  babys < babys.sql

部署uWSGI服务器

​ uWSGI是一个Web服务器,它实现WSGI、uWSGI和HTTP等网络协议,而且Nginx的HttpUwsgiModule能与uWSGI服务器进行交互。WSGI是一种Web服务器网关接口,它是Web服务器(如Nginx服务器)与Web应用(如Django框架实现的应用)通信的一种规范。在部署uWSGI服务器之前,需要在Python 3中安装相应的模块,我们使用pip3安装即可,安装指令如下:

pip install django==3.2.8
pip install uwsgi 
pip install mysqlclient
pip install pillow

​ 完成上述配置后,在CentOS 7系统中输入uwsgi指令,测试uWSGI服务器能否正常运行,指令如下:

​ 指令运行后,可以在本地系统的浏览器中输入虚拟系统的IP地址+8080端口查看测试结果,比如在浏览器上访问http://192.168.88.120:8080/,我们可以看到项目babys的首页信息。uWSGI服务器测试成功后,下一步为项目babys编写uWSGI配置文件。当项目运行上线时,只需执行uWSGI配置文件即可运行项目babys的uWSGI服务器。在项目babys的目录下创建babys_uwsgi.ini配置文件,文件代码如下:

​ 我们在虚拟系统CentOS 7中查看项目babys的目录结构,确保项目babys的根目录已存放配置文件babys_uwsgi.ini,然后输入uwsgi(uwsgi --inibabys_uwsgi.ini)指令,通过配置文件启动uWSGI服务器也可以看到项目babys。

安装Nginx并部署项目

项目的上线部署最后一个环节是部署Nginx服务器。由于虚拟系统CentOS 7的yum没有Nginx的安装源,因此将Nginx的安装源添加到yum中,然后使用yum安装Nginx服务器,指令如下:

​ Nginx安装成功后,在虚拟系统CentOS 7上输入Nginx启动指令systemctl startnginx,然后在本地系统的浏览器中输入虚拟系统CentOS 7的IP地址,可以看到Nginx启动成功,如图11-34所示。

​ 下一步设置Nginx的配置文件,将Nginx服务器与uWSGI服务器实现通信连接。将虚拟系统CentOS 7的路径切换到/etc/nginx/conf.d,在当前路径中创建并编辑babys.conf文件,在babys.conf文件中编写项目babys的配置信息,代码如下:

​ 完成Nginx的相关配置后,在虚拟系统CentOS 7中结束Nginx的进程或重启系统,确保当前系统没有运行Nginx。然后输入Nginx指令,重新启动Nginx服务器,当Nginx启动后,进入项目babys,使用uwsgi指令运行babys_uwsgi.ini,启动uWSGI服务器,输入的指令如下:

cd /etc/nginx

# 检查配置是否正确
nginx -c nginx.conf

# 重新加载配置文件
nginx -s reload 

# 启动uWSGI服务
cd /home/babys

uwsgi --ini  babys_uwsgi.ini

​ 当Nginx服务器和uWSGI服务器启动后,项目babys就已成功运行上线。在本地系统的浏览器上访问http://192.168.88.120:8090/可以看到项目babys的首页信息,地址端口从8080改为8090,因为Nginx的配置文件babys.conf监听uWSGI服务器的8080端口。

​ 当用户访问http://192.168.88.120:8090/的时候,Nginx将HTTP请求交由uWSGI服务器处理;uWSGI服务器再将HTTP请求交由Django处理和响应。

​ 除此之外,随着技术的发展,Django的项目部署方式趋向多元化发展,比如Docker、云服务器和云部署平台等,使项目部署变得更加简单和快捷。