Python 从入门到实战(十五):Flask 应用部署(把学生成绩系统放到公网上,人人可访问)

@[toc]
欢迎回到「Python 从入门到实战」系列专栏。上一篇咱们给学生成绩管理系统加上了用户认证,实现了 “管理员 - 普通用户” 的权限区分,系统已经具备完整的功能和安全性 —— 但它还只能在你的电脑上运行(localhost:5000),老师和学生无法通过互联网访问。
今天咱们要完成最后一步:Flask 应用部署。通过把系统部署到云服务器,配置域名和 HTTPS,让任何人都能通过公网地址访问你的系统。咱们会选择新手友好的 “轻量应用服务器”,从 “服务器准备” 到 “环境搭建”,再到 “代码部署”“域名配置”,一步步实现公网访问,让你的项目真正落地实用。
一、为什么需要部署?本地运行的 3 个局限
在学部署前,先明确 “部署的价值”—— 本地运行的系统存在以下问题,无法满足多人协作需求:
- 访问范围有限:只有同一局域网的设备能访问(比如家里的电脑),公网无法连接;
- 稳定性差:本地电脑关机或断网后,系统就无法访问;
- 性能不足:Flask 自带的开发服务器(
app.run())只能处理少量请求,多人同时访问会卡顿或崩溃。
而部署到云服务器后,系统会变成:
- 公网可访问:只要有网络,任何人都能通过域名访问;
- 24 小时在线:服务器持续运行,不会因本地电脑关机而中断;
- 性能可靠:通过 “Nginx+Gunicorn” 组合,支持多人同时访问,稳定不崩溃。
二、部署准备:选择工具与环境
为了降低新手门槛,咱们选择 “轻量应用服务器 + Linux 系统 + 免费工具” 的组合,成本低、配置简单:
| 类别 | 选择 | 原因 |
|---|---|---|
| 云服务器 | 阿里云轻量应用服务器(或腾讯云) | 配置简单、价格低(新手有优惠)、自带防火墙 |
| 操作系统 | Ubuntu 22.04 LTS | 稳定、开源、Python 支持好、教程丰富 |
| 服务器软件组合 | Nginx(反向代理)+ Gunicorn(WSGI 服务器) | Nginx 处理静态文件 / 转发请求,Gunicorn 运行 Flask 应用 |
| 文件传输工具 | FileZilla(或 VS Code SFTP 插件) | 可视化操作,新手容易上手,免费 |
| 远程连接工具 | PuTTY(Windows)/ 终端(macOS/Linux) | 连接服务器,执行命令 |
| 域名与 HTTPS 证书 | 阿里云 / 腾讯云域名 + Let’s Encrypt 证书 | 域名易记,HTTPS 免费(Let’s Encrypt) |
三、实战 1:服务器准备(买服务器 + 配置安全组)
这是部署的第一步,先拥有一台能联网的云服务器,新手推荐 “轻量应用服务器”,比传统云服务器配置更简单。
1. 购买轻量应用服务器(以阿里云为例)
步骤 1:注册并登录阿里云
打开阿里云官网,注册账号并完成实名认证(国内服务器必须)。
步骤 2:购买轻量应用服务器
- 搜索 “轻量应用服务器”,进入购买页面;
- 选择配置(新手推荐):
- 操作系统:Ubuntu 22.04 LTS(64 位);
- 套餐:2 核 2G 内存(足够运行 Flask 应用,新手优惠价约 100 元 / 年);
- 购买时长:1 年(新手先体验,后续可续费);
- 付款后,在 “轻量应用服务器控制台” 能看到你的服务器(包含公网 IP 地址)。
2. 配置安全组(关键!开放必要端口)
安全组相当于服务器的防火墙,必须开放以下端口才能正常访问:
| 端口 | 用途 | 必须开放 |
|---|---|---|
| 22 | SSH 远程连接(管理服务器) | 是 |
| 80 | HTTP 协议(未加密的网页访问) | 是 |
| 443 | HTTPS 协议(加密的网页访问,安全) | 是 |
配置步骤:
- 在服务器控制台找到 “安全组” 或 “防火墙” 设置;
- 新增规则,分别开放 “22 端口(TCP)”“80 端口(TCP)”“443 端口(TCP)”,来源设置为 “0.0.0.0/0”(允许所有 IP 访问);
- 保存规则,确保端口状态为 “已开放”。
3. 远程连接服务器(SSH)
通过 SSH 工具连接服务器,执行命令操作。
方式 1:Windows 用户(用 PuTTY)
- 下载 PuTTY,打开后输入服务器的公网 IP,端口默认 22;
- 点击 “Open”,首次连接会提示 “是否信任”,选择 “是”;
- 输入服务器的用户名(Ubuntu 默认是
ubuntu)和密码(购买时设置的密码,或在控制台重置); - 成功登录后,会看到
ubuntu@xxx:~$的命令提示符,说明已连接。
方式 2:macOS/Linux 用户(用终端)
- 打开终端,输入命令:
ssh ubuntu@你的服务器IP(比如ssh ubuntu@123.45.67.89); - 输入密码(输入时不显示字符,输完按回车);
- 成功登录后,进入命令行界面。
四、实战 2:服务器环境搭建(安装 Python + 依赖)
登录服务器后,需要搭建 Python 运行环境,推荐用 “虚拟环境” 隔离依赖,避免冲突。
1. 更新系统软件包
首先更新 Ubuntu 的软件包列表,确保安装的软件是最新的:
bash
# 更新软件包列表
sudo apt update
# 升级已安装的软件
sudo apt upgrade -y
sudo:获取管理员权限(执行系统操作需要);-y:自动确认升级,不用手动输入 “y”。
2. 安装 Python 与必要工具
Ubuntu 22.04 自带 Python3,但需要安装pip(Python 包管理工具)和venv(虚拟环境工具):
bash
# 安装Python3、pip3、venv
sudo apt install -y python3 python3-pip python3-venv
# 验证安装成功
python3 --version # 输出Python 3.10.x(版本号可能不同,3.8+即可)
pip3 --version # 输出pip 22.x.x
3. 创建虚拟环境(规范做法)
在服务器上创建一个专门的文件夹存放项目,然后创建虚拟环境:
bash
# 1. 创建项目文件夹(比如叫student_system)
mkdir -p ~/student_system
# 2. 进入项目文件夹
cd ~/student_system
# 3. 创建虚拟环境(环境名用venv,规范且易记)
python3 -m venv venv
# 4. 激活虚拟环境
source venv/bin/activate
激活后,命令提示符前会出现(venv),表示已进入虚拟环境(后续安装的依赖只在这个环境中生效)。
4. 安装项目依赖
咱们的项目需要Flask“Flask-Login“Flask-WTF“Gunicorn(生产环境 WSGI 服务器)等依赖,先在本地生成requirements.txt(列出所有依赖),再上传到服务器安装。
步骤 1:本地生成requirements.txt
在本地项目根目录打开终端,执行:
bash
# 激活本地虚拟环境(如果有的话)
# Windows:venv\Scripts\activate
# macOS/Linux:source venv/bin/activate
# 生成requirements.txt
pip freeze > requirements.txt
会生成一个requirements.txt文件,包含所有依赖及其版本(比如Flask==2.3.3)。
步骤 2:上传requirements.txt到服务器
用 FileZilla(文件传输工具)上传requirements.txt到服务器的~/student_system文件夹:
- 下载并打开 FileZilla,点击 “文件”→“站点管理器”;
- 新增站点:
- 协议:SFTP(SSH 文件传输协议);
- 主机:服务器公网 IP;
- 端口:22;
- 登录类型:正常;
- 用户名:ubuntu;
- 密码:服务器密码;
- 连接后,左边是本地文件,右边是服务器文件,找到本地的
requirements.txt,拖到右边的student_system文件夹。
步骤 3:服务器安装依赖
在服务器的student_system文件夹(已激活虚拟环境),执行:
bash
# 安装requirements.txt中的所有依赖
pip install -r requirements.txt
# 额外安装Gunicorn(WSGI服务器,生产环境用)
pip install gunicorn
# 验证Gunicorn安装成功
gunicorn --version # 输出gunicorn 21.x.x
五、实战 3:上传项目代码与初始化数据库
把本地的学生成绩系统代码上传到服务器,确保项目结构和本地一致。
1. 上传项目文件
用 FileZilla 把本地项目的所有文件上传到服务器的~/student_system文件夹,确保结构如下(和本地一致):
plaintext
student_system/
├── app.py # 主程序
├── models.py # 数据模型
├── requirements.txt # 依赖列表(已上传)
├── instance/ # 数据库文件夹
│ └── student.db # 本地的数据库文件(包含学生和用户数据)
├── templates/ # 模板文件夹
│ ├── base.html
│ ├── index.html
│ ├── login.html
│ └── ...(其他模板)
├── static/ # 静态文件文件夹
│ └── images/
│ ├── course_avg.png
│ └── grade_pie.png
└── venv/ # 虚拟环境(已创建,不用上传)
- 关键:必须上传
instance/student.db(本地的数据库文件,包含管理员和学生数据),否则服务器上的数据库是空的; - 不用上传
venv:服务器上已单独创建虚拟环境,本地的venv太大,没必要上传。
2. 初始化项目(验证环境)
上传完成后,在服务器的student_system文件夹(已激活虚拟环境),执行以下命令验证项目能正常运行:
bash
# 1. 激活虚拟环境(如果之前退出了)
source venv/bin/activate
# 2. 先设置Flask应用入口(告诉Flask主程序是app.py)
export FLASK_APP=app.py
# 3. 测试Flask应用(用开发服务器,仅测试,不要用于生产)
flask run --host=0.0.0.0 --port=5000
--host=0.0.0.0:允许服务器的所有 IP 访问(否则只能本地访问);--port=5000:用 5000 端口运行。
验证测试:
打开本地浏览器,访问http://你的服务器IP:5000,如果能看到登录页面,说明项目能正常运行(测试后按Ctrl+C停止开发服务器,因为开发服务器不适合生产)。
六、实战 4:用 Gunicorn 运行 Flask 应用(生产环境)
Flask 自带的开发服务器性能差、不稳定,生产环境必须用Gunicorn(WSGI 服务器)运行应用,处理用户请求。
1. 用 Gunicorn 启动应用
在服务器的student_system文件夹(已激活虚拟环境),执行:
bash
# 启动Gunicorn:绑定127.0.0.1:8000,运行app.py中的app对象
gunicorn -w 4 -b 127.0.0.1:8000 app:app
-w 4:启动 4 个工作进程(推荐设置为 “2×CPU 核心数”,2 核服务器设为 4,1 核设为 2);-b 127.0.0.1:8000:绑定本地的 8000 端口(只允许服务器内部访问,后续用 Nginx 转发);app:app:第一个app是主程序文件名app.py,第二个app是app.py中初始化的app = Flask(__name__)对象。
验证 Gunicorn 运行:
在服务器上执行以下命令,测试 Gunicorn 是否正常响应:
bash
# 用curl工具访问本地8000端口
curl http://127.0.0.1:8000
如果输出登录页面的 HTML 代码,说明 Gunicorn 运行正常(按Ctrl+C停止,后续配置后台运行)。
2. 配置 Gunicorn 后台运行(systemd)
用systemd(Ubuntu 的服务管理工具)配置 Gunicorn,实现 “开机自启”“崩溃自动重启”,不用手动维持运行。
步骤 1:创建 systemd 服务文件
bash
# 用nano编辑器创建服务文件(nano是简单的文本编辑器)
sudo nano /etc/systemd/system/student-system.service
粘贴以下内容(注意替换ubuntu为你的用户名,确保路径正确):
ini
[Unit]
# 服务描述
Description=Student Score Management System Gunicorn Service
# 依赖网络服务(网络就绪后再启动)
After=network.target
[Service]
# 运行用户(用ubuntu,避免root权限风险)
User=ubuntu
# 运行组
Group=ubuntu
# 工作目录(项目文件夹路径)
WorkingDirectory=/home/ubuntu/student_system
# 激活虚拟环境并启动Gunicorn的命令
ExecStart=/home/ubuntu/student_system/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app
# 重启策略:崩溃后自动重启
Restart=always
# 重启间隔:崩溃后1秒再重启
RestartSec=1
[Install]
# 开机自启时关联的目标(多用户模式)
WantedBy=multi-user.target
步骤 2:保存并退出 nano
按Ctrl+O(保存),按回车确认文件名,再按Ctrl+X(退出)。
步骤 3:启动并设置开机自启
bash
# 重新加载systemd配置(让系统识别新服务)
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start student-system
# 设置开机自启
sudo systemctl enable student-system
# 查看服务状态(确认是否正常运行)
sudo systemctl status student-system
如果输出 “active (running)”,说明服务正常运行(绿色字体)。
七、实战 5:配置 Nginx(反向代理 + 静态文件)
Gunicorn 处理 Python 请求很高效,但不擅长处理静态文件(比如static/images中的图表),也不适合直接暴露在公网。用 Nginx 作为 “反向代理”,实现:
- 接收公网用户的 HTTP/HTTPS 请求;
- 把动态请求(比如登录、查询)转发给 Gunicorn;
- 直接返回静态文件(图片、CSS),提高性能。
1. 安装 Nginx
bash
# 安装Nginx
sudo apt install -y nginx
# 启动Nginx并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 验证Nginx运行:访问服务器IP,能看到Nginx默认页面
2. 创建 Nginx 配置文件
为咱们的项目创建单独的 Nginx 配置,不要修改默认配置:
bash
# 创建配置文件(文件名用student-system,易识别)
sudo nano /etc/nginx/sites-available/student-system
粘贴以下内容(替换你的服务器IP为实际 IP,比如123.45.67.89):
nginx
# 服务器配置
server {
# 监听80端口(HTTP)
listen 80;
# 服务器域名或IP(暂时用IP,后续替换为域名)
server_name 你的服务器IP;
# 静态文件配置:匹配/static/开头的请求,直接返回文件
location /static/ {
# 静态文件在服务器上的路径(绝对路径)
root /home/ubuntu/student_system;
# 缓存静态文件(30天,减轻服务器压力)
expires 30d;
}
# 动态请求配置:其他所有请求转发给Gunicorn
location / {
# 转发到Gunicorn的地址
proxy_pass http://127.0.0.1:8000;
# 传递用户真实IP和请求头(重要,否则Flask无法获取用户IP)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
关键说明:
location /static/:处理静态文件请求,比如http://IP/static/images/course_avg.png,直接从/home/ubuntu/student_system/static/文件夹返回文件;proxy_pass http://127.0.0.1:8000:把动态请求(如登录、查询)转发给 Gunicorn 处理。
3. 启用 Nginx 配置
Nginx 的配置文件需要放在sites-enabled文件夹才会生效,用 “软链接” 关联:
bash
# 创建软链接(启用配置)
sudo ln -s /etc/nginx/sites-available/student-system /etc/nginx/sites-enabled/
# 检查Nginx配置是否有错误
sudo nginx -t
# 如果输出“test is successful”,重启Nginx生效
sudo systemctl restart nginx
4. 验证 Nginx 配置
打开本地浏览器,访问http://你的服务器IP:
- 能看到登录页面(说明 Nginx 转发正常);
- 登录后能看到图表(说明静态文件配置正常);
- 尝试查询、新增学生(管理员账号),功能正常。
八、实战 6:配置域名与 HTTPS(安全访问)
用 IP 访问不够友好(难记),且 HTTP 协议不加密(数据传输不安全),需要配置域名和 HTTPS。
1. 购买并解析域名(以阿里云为例)
步骤 1:购买域名
- 在阿里云搜索 “域名注册”,选择一个易记的域名(比如
student-example.top,新手推荐.top/.xyz 等后缀,便宜); - 完成购买(需要实名认证,1-2 天审核通过)。
步骤 2:解析域名到服务器 IP
- 域名审核通过后,进入 “域名解析” 控制台;
- 新增解析记录:
- 记录类型:A(指向 IPv4 地址);
- 主机记录:
@(表示直接用域名访问,如student-example.top); - 记录值:服务器的公网 IP;
- TTL:默认 10 分钟(解析生效时间);
- 保存记录,等待 10-30 分钟,域名会指向服务器 IP。
2. 配置 HTTPS(用 Let’s Encrypt 免费证书)
用certbot工具自动申请并配置 Let’s Encrypt 免费证书(有效期 3 个月,可自动续期)。
步骤 1:安装 certbot
bash
# 安装certbot和Nginx插件
sudo apt install -y certbot python3-certbot-nginx
步骤 2:申请并配置证书
bash
# 申请证书并自动配置Nginx(替换为你的域名)
sudo certbot --nginx -d 你的域名
按提示操作:
- 输入邮箱(用于证书到期提醒);
- 同意服务条款(输入
A); - 是否共享邮箱(输入
N); - 选择是否自动跳转 HTTPS(输入
2,强制所有 HTTP 请求跳转到 HTTPS)。
步骤 3:验证 HTTPS
打开浏览器,访问https://你的域名:
- 地址栏会显示 “小锁” 图标(表示 HTTPS 正常);
- 能正常登录和使用系统,数据传输加密安全。
步骤 4:配置证书自动续期
Let’s Encrypt 证书有效期 3 个月,用cron定时任务自动续期:
bash
# 编辑crontab定时任务
sudo crontab -e
# 选择编辑器(第一次会提示,选1或2都可以)
# 在文件末尾添加以下内容(每天凌晨3点续期)
0 3 * * * certbot renew --quiet --renew-hook "systemctl restart nginx"
--quiet:安静模式,不输出日志;--renew-hook:续期成功后重启 Nginx,让证书生效。
九、实战 7:常见问题排查(新手必看)
部署过程中容易遇到各种问题,总结以下高频问题及解决方案:
问题 1:浏览器访问 IP / 域名无响应
- 可能原因:安全组未开放 80/443 端口;
- 解决方案:回到服务器控制台,检查安全组规则,确保 80(HTTP)和 443(HTTPS)端口开放,来源为
0.0.0.0/0。
问题 2:静态文件 404(图表不显示)
- 可能原因:Nginx 的
root路径配置错误; - 解决方案:
- 检查 Nginx 配置文件中的
root /home/ubuntu/student_system是否正确(绝对路径,确保static文件夹在这个路径下); - 重启 Nginx:
sudo systemctl restart nginx; - 查看 Nginx 日志排查:
sudo tail -f /var/log/nginx/error.log(显示错误原因)。
- 检查 Nginx 配置文件中的
问题 3:Gunicorn 服务启动失败
- 可能原因:路径错误、虚拟环境未激活、依赖缺失;
- 解决方案:
- 查看服务日志:
sudo journalctl -u student-system -f(显示失败原因); - 检查
student-system.service中的WorkingDirectory和ExecStart路径是否正确; - 手动激活虚拟环境测试:
cd ~/student_system && source venv/bin/activate && gunicorn -w 4 -b 127.0.0.1:8000 app:app,看是否报错。
- 查看服务日志:
问题 4:数据库连接错误(无法登录)
- 可能原因:
instance/student.db未上传,或权限不足; - 解决方案:
- 用 FileZilla 确认
instance/student.db已上传到服务器的student_system文件夹; - 修复文件权限:
chmod -R 755 ~/student_system/instance(确保 Flask 能读写数据库)。
- 用 FileZilla 确认
十、小结:部署流程回顾与最终效果
部署完整流程
- 准备阶段:买轻量应用服务器→配置安全组→SSH 连接;
- 环境阶段:更新系统→安装 Python/venv→创建虚拟环境→安装依赖;
- 代码阶段:上传项目文件(含数据库)→验证 Flask 运行;
- 服务阶段:配置 Gunicorn(后台运行)→配置 Nginx(反向代理 + 静态文件);
- 优化阶段:买域名→解析域名→配置 HTTPS→设置证书自动续期。
最终效果
- 访问方式:任何人通过
https://你的域名访问系统; - 功能:管理员能增删改查,普通用户能查询,图表正常显示;
- 稳定性:服务器 24 小时在线,崩溃自动重启,支持多人同时访问;
- 安全性:HTTPS 加密传输,用户认证 + 权限控制,数据安全。
十一、系列专栏总结
从第一篇的 Python 环境搭建,到第十五篇的公网部署,咱们完成了一个 “从 0 到 1” 的完整项目 ——在线学生成绩管理系统,掌握了:
- 基础语法:变量、列表、字典、函数、类、文件操作;
- 数据处理:Pandas 分析数据、Matplotlib/Seaborn 可视化;
- Web 开发:Flask 路由、模板、表单、数据库(SQLite)、用户认证;
- 项目部署:云服务器、Nginx+Gunicorn、域名 + HTTPS。
这个系统不仅是一个实战项目,更是你后续开发其他 Python 应用的基础 —— 比如修改成 “图书管理系统”“考勤系统”,只需替换数据模型和业务逻辑即可。
如果你跟着完成了所有步骤,恭喜你!你已经具备了 Python 全栈开发的核心能力,接下来可以尝试更复杂的项目(如电商网站、数据分析平台),继续进阶~
- 点赞
- 收藏
- 关注作者
评论(0)