Centos环境django项目部署过程

一、前言

Django是一款针对Python环境的开源WEB开发框架,采用BSD license,能够帮助我们快速开发安全和可维护的网站。它采用MTV 架构: 采用 Model(模型)、Template(模板)、View(视图)模式,强制代码分离,结构清晰,非常适合团队协作和大型项目维护。它还提供了DRF(Django REST Framework): 是构建 API 的行业标准工具包。如果你需要开发前后端分离的项目(如配合 React/Vue 前端或移动端 App),DRF 提供了强大的序列化、认证和视图集功能。

总之,它内置了开发 Web 应用所需的大部分核心功能,让你无需重复造轮子,让开发人员只需专注于编写应用程序。比如:

  • 自动管理后台(Admin Panel): 这是 Django 的杀手锏。只需几行代码,你就能获得一个功能完善、美观且安全的管理后台,用于管理数据(增删改查)。
  • 强大的 ORM(对象关系映射): 你不需要编写繁琐的 SQL 语句 。通过 Python 类即可定义数据库结构,Django 会自动处理数据库迁移和 CRUD 操作,支持 MySQL、PostgreSQL、SQLite 等主流数据库。
  • 完整的用户认证系统: 内置了用户注册、登录、权限管理、密码加密和会话控制功能,无需从头开发。

另外Django 极其重视安全性,默认开启多种防护机制,帮助你避免常见的 Web 漏洞:防护 SQL 注入: ORM 机制自动处理参数转义。防护跨站脚本(XSS)和跨站请求伪造(CSRF): 模板引擎和中间件默认拦截恶意请求。点击劫持防护: 内置相关 HTTP 头设置;

Django 社区活跃繁荣,有丰富的文档,Django已经成为web开发者的首选框架,是一个遵循 MVC(Model、View、Controller) 设计模式的框架,其中控制器接受用户输入的部分由框架自行处理,使用Django框架的URLconf来实现;URLconf机制是使用正则表达式匹配URL,然后调用合适的Python函数处理;Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。Django 4.0+ 支持异步视图,Django 5.0+ 更是实现了异步 ORM 查询,彻底解决了长期以来的 I/O 阻塞痛点,使其在高并发场景下的性能得到了质的飞跃。

关联资源Django5 中文文档达梦python-djangoDjango官网uWSGI 2.0 文档

二、Djiango回顾

2.1、Django回顾

Django有严格的"约定优于配置"理念,基于Python编程语言驱动,遵循一种称为MTV(模型-模板-视图)模式的架构模式,Django 将 MVC 中的视图进一步分解为 Django 视图和 Django 模板两个部分,MVC 中的控制器由 Django 框架的 URLconf 来实现;这种模式运行我们方便、快捷地创建高品质、易维护、数据库驱动的应用程序。当你创建一个项目时,它会自动生成固定的文件夹结构(models, views, templates 等);项目代码风格统一,约定俗成,意味着如果你想打破常规,会觉得很受限。Django 框架的核心组件有:

  • 用于创建模型的对象关系映射 (ORM,object-relational mapping);其中模型是定义应用程序数据结构的 Python 对象,并提供在数据库中管理(添加,修改,删除)和查询记录的机制。Django 的 Model 层自带数据库 ORM 组件,ORM将模型与关系数据库连接起来,将得到一个非常容易使用的数据库API,在Django中使用原始的SQL语句;
  • 为最终用户设计较好的管理界面:Django自带一个ADMIN site,类似于内容管理系统;
  • URL 设计:用于根据请求 URL 将 HTTP 请求重定向到相应的视图,视图是一个请求处理函数,它接收 HTTP 请求并返回 HTTP 响应;它使用正则表达式匹配URL,可以设计任意的URL,传统的,RESTful的等;
  • 设计者友好的模板语言;
  • 缓存系统:可以挂在内存缓冲或其它的框架实现超级缓冲 实现所需要的粒度


  • 模型(Model),即数据存取层,处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  • 模板(Template),即表现层,处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。模板仅决定如何展现Django视图指定的数据。因Django将MVC中的视图进一步分解为 Django视图Django模板两个部分,分别决定 "展现哪些数据" 和 "如何展现",使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
  • 视图(View),即业务逻辑层,存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。Django 视图不处理用户输入,仅仅决定要展现哪些数据给用户;


2.2、Django和Flask

Django 和 Flask 是 Python 生态中最著名的两个 Web 框架,它们的核心区别可以用一句话概括:Django 是"自带全套家具的精装房",而 Flask 是"只有地基和框架的毛坯房"。Django 像一个"全能工具箱"。它内置了强大的 ORM进行数据库操作。它可轻松生成 Admin 面板进行后台管理。内置了完整的认证系统确保登录安全。你甚至不需要自己写 SQL,也不用纠结选哪个第三方库,因为它都给你准备好了。而Flask (自助式)像一个"灵活的积木",追求轻量自由,核心只解决"路由"(网址跳转)和"模板"(页面显示)。通过Flask-SQLAlchemy操作数据库,通过 Flask-Login实现登录,这给了我们极大的自由度,去挑选和整合组件实现个性化功能。

对比维度 Django (全栈框架) Flask (微框架)
核心定位 "自带电池":开箱即用,功能大而全重量级 Web 框架 "微内核":极简核心,按需扩展
上手难度 中等/陡峭:概念多,需理解整套规范 极低:核心简单,几行代码即可运行
自带功能 超级全:内置后台管理、ORM、用户认证、安全防护等 极简:仅含路由和模板,数据库/登录需自己装
灵活性 较低:强制约定项目结构,需按规则出牌 极高:无强制结构,想怎么搭就怎么搭
适用场景 中大型网站、电商、CMS、企业级系统 小型项目(功能简单,不想引入沉重的框架)、API服务(只需几个接口给前端或 App 调用)、微服务、个人练手(flask 代码量少易理解),个性定制

2.3、使用场景

推荐使用 Django 的场景:

  • 内容管理系统: 新闻门户、博客、企业官网(Admin 后台极其好用)。
  • 电商平台与 SaaS: 需要复杂的用户权限、支付安全和订单管理。
  • 快速原型开发: 需要在短时间内从 0 到 1 上线 MVP(最小可行性产品)。追求开发速度,需要快速上线一个功能完备的产品,不想在配置环境和选库上浪费时间,需要多人协作,想保证代码质量;
  • 数据驱动应用: 需要与 AI、机器学习模型(如 TensorFlow/PyTorch)深度集成的 Web 服务。
  • 其他企业级应用:需要复杂的数据库交互和用户权限管理;Django 默认防 SQL 注入、CSRF 等攻击,非常适合金融、政务等敏感场景。

可能不适合 Django 的场景:

极度轻量级的微服务: 如果只需要一个简单的接口,Flask 或 FastAPI 可能更轻量。

超高并发的实时通信: 虽然 Django Channels 支持 WebSocket,但在纯即时通讯或游戏服务器领域,Go 或 Node.js 可能更具性能优势(尽管 Django 的异步能力正在缩小这一差距)。

三、部署

3.1、django项目部署示例

1)部署前检查

bash 复制代码
django-admin --version  #查看版本号
uwsgi --version         #查看版本号;uWSGI是一款基于C语言开发的Web服务器和应用服务器,支持多种编程语言和平台;它实现了WSGI(Web服务器网关接口)、uwsgi(一种轻量级二进制协议)和HTTP等协议,其中WSGI是Web服务器与Web应用之间通信的标准规范。通过与Nginx的HttpUwsgiModule模块实现通信交互,该服务器提供异步/非堵塞模式以提高并发性,需使用--async选项初始化异步核数。在典型的PythonWeb应用部署架构中,uWSGI作为应用服务器,负责运行动态Python应用,并与Nginx等前端Web服务器通过uwsgi协议或HTTP socket进行通信

2)基础依赖环境安装

bash 复制代码
yum -y groupinstall "Development tools"

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
yum -y install wget vim unzip

3)安装python与pip

:或者python多版本管理工具pyenv,pyenv是利用系统环境变量PATH的优先级,劫持python的命令到pyenv上,根据用户所在的环境或目录,使用不同版本的python。

bash 复制代码
## 1.下载自己需要版本的python版本包
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
 
## 2.新建python3目录
mkdir /usr/local/python3
 
## 3.安装Python3压缩包,进入解压目录,指定安装目录,安装Python3
tar -xvf  Python-3.9.5.tar.xz
cd Python-3.9.5
./configure --prefix=/usr/local/python3
make && make install
 
## 4.安装Python3时,会自动安装pip,如果没有就手动安装
yum -y install python-pip
 
## 5.pip配置(更换pip的源)
(1)找到pip.conf并编辑
cd ~ 
mkdir .pip 
vim pip.conf
 
[global] 
index-url = https://mirrors.aliyun.com/pypi/simple/ 
[install] 
trusted-host=mirrors.aliyun.com
 
:wq!保存退出即可
 
#安装依赖安装好pip
yum -y install epel-release
yum install python-pip
pip install --upgrade pip
 
## 6.升级下pip
pip install --upgrade pip
 
## 7.创建软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
 
## 输入python3测试是否安装成功
python -V

4)安装nginx、uwsgi

bash 复制代码
yum -y install nginx

nginx -v

vim /etc/nginx/nginx.conf  #配置如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
  
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
  
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        charset utf-8;
        location /static {
               alias /项目所在目录/static/;
        }
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
        }
    }
}

nginx -t
## 3.启动nginx
systemctl status nginx 
systemctl start nginx  
systemctl stp nginx

#安装uwsgi
pip3 install uwsgi
  
##建立软链接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
  
#验证
uwsgi --version

5)部署django项目

bash 复制代码
#上传项目并安装项目模块,启动测试
#上传解压项目
unzaip devops.zip
  
#pip安装项目依赖模块
pip3 install -r requirements.txt
  
##测试
python3 manage.py runserver #运行一下项目,如果能正常启动则进行下一步,不能正常运行往上检查。注意使用python3来执行manage.py,否则会出现报错情况!

#在web项目下,即settings.py所在目录vim新文件---->项目名称.ini
vi myweb.ini  #示例如下
[uwsgi]
master=true
chdir=/data(服务器实际目录)/项目名称
module=myweb.wsgi
py-autoreload=1
lazy-apps=true  
socket=127.0.0.1:8000
processes=4
buffer-size=32768
daemonize=uwsgi.log
log-maxsize = 5000000
vacuum = true
disable-logging = true

#确认settings.py配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
STATICFILES_DIRS = [
  os.path.join(BASE_DIR, '../bitmain_cmdb/static'),  ## 实际静态文件所在项目路径
]

#url.py配置
from django.conf.urls import *
from django.contrib import admin
from django.conf.urls import url,include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
    url(r'^cmdb_admin/', admin.site.urls),
] + static(settings.STATIC_URL,document_root = settings.STATIC_ROOT)

#收集静态文件
python manage.py collectstatic

##测试:在当前目录启动
uwsgi -i 项目名称.ini
  
## 启动之后查看进程
ps -ef | grep uwsgi

#验证,浏览器访问django项目http://服务器ip/login/

#之后项目重启只需要重启uwsgi之后再重启nginx即可,切记正式环境要关掉django的debug模式防止报错源码被看到
## 项目重启
killall -9  uwsgi
uwsgi -i 项目名称.ini
nginx -s reload
## 关闭项目debug模式
vim  settings.py 
debug = Fasle

6)docker部署

bash 复制代码
#创建一个工作目录用来存放项目,和Dockerfile等文件
mkdir uwsgidocker
#文件说明,在django项目中的settings.py文件里,需要将   ALLOWED_HOSTS = [] 改为 ALLOWED_HOSTS = [ " * " ]
docker-compose.yml: Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。在一开始我没有使用docker-compose.yml
Dockerfile: 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
my_django:是一个刚创建的django项目,主要是将 ALLOWED_HOSTS = [] 改为 ALLOWED_HOSTS = ["*"] 
nginxconf:是个包含nginx配置和创建nginx镜像的Dockerfile文件的文件夹。
pip.conf:是关于pip的配置,主要是用于pip加速下载的。
uwsgi_conf.ini: uwsgi的配置文件

#根据Dockerfile文件制作uwsgi的镜像并运行
FROM python:3.8.3
# 创建目录
RUN mkdir -p /usr/src/app
# 设置工作目录
WORKDIR /usr/src/app
 
# 将pip.conf文件复制到/root/.pip/pip.conf
COPY pip.conf /root/.pip/pip.conf
# 更新pip
RUN pip install --upgrade pip
# 下载django和uwsgi 在一般项目中只需下载requirement.txt
RUN pip install django && pip install uwsgi
# 将当前目录下的文件全部复制过去,只有是复制项目,uwsgi配置文件
COPY . /usr/src/app/
# 在run的时候启动uwsgi
CMD uwsgi --ini uwsgi_conf.ini
# 暴露端口
EXPOSE 80 8080 8000 8888

#uwsgi_conf.ini
[uwsgi]
# 项目目录,由于在当前目录,直接写就好了
chdir = my_django
# uwsgi的启动文件,在项目下的wsgi.py
module = my_django.wsgi
# 允许主线程存在(true)
master = true
# 进程数
processes = 1
# 用于指定项目的运行的端口,可以使用socket和http,我使用的是http便于查看
http = 0.0.0.0:8000
# socket = 0.0.0.0:8000
 
# http = 10.0.0.10:8000
# socket = 10.0.0.10:8008
# socket = /usr/src/app/my_django/uwsgi.sock
# 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
vacuum = true

#制作uwsgi镜像
docker build -t myuwsgi ./
docker images

#运行uwsgi镜像
docker run --rm -it --name webuwsgi -p 8000:8000 myuwsgi

#验证,浏览器访问 ip:8000,看到:安装成功!祝贺!

#制作nginx镜像,用于反向代理
cd nginxconf/  #进入nginxconf目录编辑Dockerfile文件
FROM nginx
 
# 删除默认的nginx配置文件
RUN rm -rf /etc/nginx/conf.d/default.conf
# 将当前目录下的配置文件拷贝到/etc/nginx/conf.d/目录下
COPY nginx.conf /etc/nginx/conf.d/nginx.conf
 
EXPOSE 80

#nginx.conf
server {
 # 监听端口
 listen 80;
 # 主机名
 server_name localhost;
 location / {
 include uwsgi_params;
 # uwsgi服务的ip与端口,
 proxy_pass http://192.167.0.2:8000;
 # uwsgi使用socket时可直接使用
 # uwsgi_pass 192.167.0.2:8000;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
  
 location /static {
 # 静态文件
 alias /usr/share/nginx/html/static;
 }
}
#验证
docker inspect webuwsgi
#制作nginx镜像
docker build -t mynginx ./
#运行
docker run --rm -it -p 80:80 --name nginxweb mynginx

#uwsgi+nginx+docker-compose部署django项目
#docker-compose.yml文件
version: '3'
services:
version: '3'
services:
 uwsgi:
 build:
 context: ./
 image: uwsgi
 restart: always
 networks:
 django:
 ipv4_address: 10.0.0.10
 ports:
 - "8000:8000"
 volumes:
 - /root/uwsgidocker/:/usr/src/app/:rw
 command: uwsgi --ini /usr/src/app/uwsgi_conf.ini
 
 nginx:
 image: myweb
 build:
 context: ./nginxconf
 ports:
 - "80:80"
 - "8080:8080"
 volumes:
 - /root/uwsgidocker/nginxconf/nginx.conf:/etc/nginx/conf.d/nginx.conf:rw
 restart: always
 privileged: true
 networks:
 django:
 ipv4_address: 10.0.0.20
networks:
 django:
 ipam:
 config:
 - subnet: 10.0.0.0/24

#修改uwsgi_conf.ini 
[uwsgi]
chdir = my_django
 
module = my_django.wsgi
 
uid = root
gid = root
 
master = true
 
processes = 1
 
# http = 0.0.0.0:8000
# socket = 0.0.0.0:8000
 
# http = 10.0.0.10:8000
socket = 10.0.0.10:8008  #修改为你的ip,nginx.conf文件,同理,更改ip
# socket = /usr/src/app/my_django/uwsgi.sock
 
vacuum = true

#构建镜像&&启动容器,完成后浏览器输入IP,进行访问
docker-compose up 或者 docker-compose up -d #后台运行
docker-compose stop #停止容器的运行
docker-compose down #停止并删除容器

3.2、Django使用

bash 复制代码
#创建 Django 项目
django-admin startproject myproject
#项目结构如下
myproject/
    manage.py         # 项目管理入口
    myproject/
        __init__.py   # 包初始化文件
        settings.py   # 配置文件
        urls.py       # URL 路由配置
        wsgi.py       # 部署文件
#启动运行项目目
python manage.py runserver #浏览器访问 http://127.0.0.1:8000,即可看到 Django 的默认欢迎页面

#启动具体项目应用
python manage.py startapp 你的项目应用 #创建后,需在 settings.py 的 INSTALLED_APPS 中注册该项目名称

四、项目参考

4.1、电商网站(Django框架)------ 思维导图




相关推荐
源码之家2 小时前
计算机毕业设计源码:京东商品数据采集分析可视化系统python Django Selenium爬虫 人工智能 大数据(建议收藏)✅
人工智能·爬虫·python·信息可视化·数据分析·django·课程设计
源码之家2 小时前
计算机毕业设计:Python股票数据分析与ARIMA预测系统 Flask框架 ARIMA 数据分析 可视化 大数据 大模型(建议收藏)✅
大数据·python·数据挖掘·数据分析·django·flask·课程设计
北冥有羽Victoria2 小时前
Django Auth组件完整版教程:从原理到项目落地
大数据·服务器·数据库·后端·python·django·sqlite
HackTorjan4 小时前
AI图像处理的核心原理:深度学习驱动的视觉特征提取与重构
图像处理·人工智能·深度学习·django·sqlite
小宏运维有点菜17 小时前
服务器 BMC 管理 IP
服务器·tcp/ip·centos
特长腿特长19 小时前
LVS_DR 模式的原理
linux·运维·网络·云原生·centos·lvs
geBR OTTE20 小时前
flask后端开发(8):Flask连接MySQL数据库+ORM增删改查
数据库·mysql·flask
Keep Running *21 小时前
Django_学习笔记
笔记·学习·django
码界筑梦坊1 天前
89-基于Django的加利福尼亚州各县死亡概况分析系统
数据库·python·信息可视化·数据分析·django·毕业设计