一、前言

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-django、Django官网、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框架)------ 思维导图




