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

举报
倔强的石头_ 发表于 2026/01/09 11:26:43 2026/01/09
【摘要】 今天咱们要完成最后一步:Flask 应用部署。通过把系统部署到云服务器,配置域名和 HTTPS,让任何人都能通过公网地址(比如https://student.example.com)访问你的系统。咱们会选择新手友好的 “轻量应用服务器”,从 “服务器准备” 到 “环境搭建”,再到 “代码部署”“域名配置”,一步步实现公网访问,让你的项目真正落地实用。

image.png

@[toc]
欢迎回到「Python 从入门到实战」系列专栏。上一篇咱们给学生成绩管理系统加上了用户认证,实现了 “管理员 - 普通用户” 的权限区分,系统已经具备完整的功能和安全性 —— 但它还只能在你的电脑上运行(localhost:5000),老师和学生无法通过互联网访问。

今天咱们要完成最后一步:Flask 应用部署。通过把系统部署到云服务器,配置域名和 HTTPS,让任何人都能通过公网地址访问你的系统。咱们会选择新手友好的 “轻量应用服务器”,从 “服务器准备” 到 “环境搭建”,再到 “代码部署”“域名配置”,一步步实现公网访问,让你的项目真正落地实用。

一、为什么需要部署?本地运行的 3 个局限

在学部署前,先明确 “部署的价值”—— 本地运行的系统存在以下问题,无法满足多人协作需求:

  1. 访问范围有限:只有同一局域网的设备能访问(比如家里的电脑),公网无法连接;
  2. 稳定性差:本地电脑关机或断网后,系统就无法访问;
  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:购买轻量应用服务器

  1. 搜索 “轻量应用服务器”,进入购买页面;
  2. 选择配置(新手推荐):
    • 操作系统:Ubuntu 22.04 LTS(64 位);
    • 套餐:2 核 2G 内存(足够运行 Flask 应用,新手优惠价约 100 元 / 年);
    • 购买时长:1 年(新手先体验,后续可续费);
  3. 付款后,在 “轻量应用服务器控制台” 能看到你的服务器(包含公网 IP 地址)。

2. 配置安全组(关键!开放必要端口)

安全组相当于服务器的防火墙,必须开放以下端口才能正常访问:

端口 用途 必须开放
22 SSH 远程连接(管理服务器)
80 HTTP 协议(未加密的网页访问)
443 HTTPS 协议(加密的网页访问,安全)

配置步骤:

  1. 在服务器控制台找到 “安全组” 或 “防火墙” 设置;
  2. 新增规则,分别开放 “22 端口(TCP)”“80 端口(TCP)”“443 端口(TCP)”,来源设置为 “0.0.0.0/0”(允许所有 IP 访问);
  3. 保存规则,确保端口状态为 “已开放”。

3. 远程连接服务器(SSH)

通过 SSH 工具连接服务器,执行命令操作。

方式 1:Windows 用户(用 PuTTY)

  1. 下载 PuTTY,打开后输入服务器的公网 IP,端口默认 22;
  2. 点击 “Open”,首次连接会提示 “是否信任”,选择 “是”;
  3. 输入服务器的用户名(Ubuntu 默认是ubuntu)和密码(购买时设置的密码,或在控制台重置);
  4. 成功登录后,会看到ubuntu@xxx:~$的命令提示符,说明已连接。

方式 2:macOS/Linux 用户(用终端)

  1. 打开终端,输入命令:ssh ubuntu@你的服务器IP(比如ssh ubuntu@123.45.67.89);
  2. 输入密码(输入时不显示字符,输完按回车);
  3. 成功登录后,进入命令行界面。

四、实战 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. 安装项目依赖

咱们的项目需要FlaskFlask-LoginFlask-WTFGunicorn(生产环境 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文件夹:

  1. 下载并打开 FileZilla,点击 “文件”→“站点管理器”;
  2. 新增站点:
    • 协议:SFTP(SSH 文件传输协议);
    • 主机:服务器公网 IP;
    • 端口:22;
    • 登录类型:正常;
    • 用户名:ubuntu;
    • 密码:服务器密码;
  3. 连接后,左边是本地文件,右边是服务器文件,找到本地的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,第二个appapp.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 作为 “反向代理”,实现:

  1. 接收公网用户的 HTTP/HTTPS 请求;
  2. 把动态请求(比如登录、查询)转发给 Gunicorn;
  3. 直接返回静态文件(图片、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

  1. 能看到登录页面(说明 Nginx 转发正常);
  2. 登录后能看到图表(说明静态文件配置正常);
  3. 尝试查询、新增学生(管理员账号),功能正常。

八、实战 6:配置域名与 HTTPS(安全访问)

用 IP 访问不够友好(难记),且 HTTP 协议不加密(数据传输不安全),需要配置域名和 HTTPS。

1. 购买并解析域名(以阿里云为例)

步骤 1:购买域名

  1. 在阿里云搜索 “域名注册”,选择一个易记的域名(比如student-example.top,新手推荐.top/.xyz 等后缀,便宜);
  2. 完成购买(需要实名认证,1-2 天审核通过)。

步骤 2:解析域名到服务器 IP

  1. 域名审核通过后,进入 “域名解析” 控制台;
  2. 新增解析记录:
    • 记录类型:A(指向 IPv4 地址);
    • 主机记录:@(表示直接用域名访问,如student-example.top);
    • 记录值:服务器的公网 IP;
    • TTL:默认 10 分钟(解析生效时间);
  3. 保存记录,等待 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 你的域名

按提示操作:

  1. 输入邮箱(用于证书到期提醒);
  2. 同意服务条款(输入A);
  3. 是否共享邮箱(输入N);
  4. 选择是否自动跳转 HTTPS(输入2,强制所有 HTTP 请求跳转到 HTTPS)。

步骤 3:验证 HTTPS

打开浏览器,访问https://你的域名

  1. 地址栏会显示 “小锁” 图标(表示 HTTPS 正常);
  2. 能正常登录和使用系统,数据传输加密安全。

步骤 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路径配置错误;
  • 解决方案
    1. 检查 Nginx 配置文件中的root /home/ubuntu/student_system是否正确(绝对路径,确保static文件夹在这个路径下);
    2. 重启 Nginx:sudo systemctl restart nginx
    3. 查看 Nginx 日志排查:sudo tail -f /var/log/nginx/error.log(显示错误原因)。

问题 3:Gunicorn 服务启动失败

  • 可能原因:路径错误、虚拟环境未激活、依赖缺失;
  • 解决方案
    1. 查看服务日志:sudo journalctl -u student-system -f(显示失败原因);
    2. 检查student-system.service中的WorkingDirectoryExecStart路径是否正确;
    3. 手动激活虚拟环境测试:cd ~/student_system && source venv/bin/activate && gunicorn -w 4 -b 127.0.0.1:8000 app:app,看是否报错。

问题 4:数据库连接错误(无法登录)

  • 可能原因instance/student.db未上传,或权限不足;
  • 解决方案
    1. 用 FileZilla 确认instance/student.db已上传到服务器的student_system文件夹;
    2. 修复文件权限:chmod -R 755 ~/student_system/instance(确保 Flask 能读写数据库)。

十、小结:部署流程回顾与最终效果

部署完整流程

  1. 准备阶段:买轻量应用服务器→配置安全组→SSH 连接;
  2. 环境阶段:更新系统→安装 Python/venv→创建虚拟环境→安装依赖;
  3. 代码阶段:上传项目文件(含数据库)→验证 Flask 运行;
  4. 服务阶段:配置 Gunicorn(后台运行)→配置 Nginx(反向代理 + 静态文件);
  5. 优化阶段:买域名→解析域名→配置 HTTPS→设置证书自动续期。

最终效果

  • 访问方式:任何人通过https://你的域名访问系统;
  • 功能:管理员能增删改查,普通用户能查询,图表正常显示;
  • 稳定性:服务器 24 小时在线,崩溃自动重启,支持多人同时访问;
  • 安全性:HTTPS 加密传输,用户认证 + 权限控制,数据安全。

十一、系列专栏总结

从第一篇的 Python 环境搭建,到第十五篇的公网部署,咱们完成了一个 “从 0 到 1” 的完整项目 ——在线学生成绩管理系统,掌握了:

  1. 基础语法:变量、列表、字典、函数、类、文件操作;
  2. 数据处理:Pandas 分析数据、Matplotlib/Seaborn 可视化;
  3. Web 开发:Flask 路由、模板、表单、数据库(SQLite)、用户认证;
  4. 项目部署:云服务器、Nginx+Gunicorn、域名 + HTTPS。

这个系统不仅是一个实战项目,更是你后续开发其他 Python 应用的基础 —— 比如修改成 “图书管理系统”“考勤系统”,只需替换数据模型和业务逻辑即可。

如果你跟着完成了所有步骤,恭喜你!你已经具备了 Python 全栈开发的核心能力,接下来可以尝试更复杂的项目(如电商网站、数据分析平台),继续进阶~

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。