Flask 项目 Windows 服务器部署全流程
Flask 项目 Windows 服务器部署全流程(含本地依赖生成、打包与后台运行指南)
一、写在前面
在 Windows 服务器上部署 Flask 项目时,常常会遇到环境兼容、依赖缺失、外网访问失败等问题,尤其是生产环境中需要“无窗口后台运行”的需求。本文从本地准备到服务器部署全流程拆解,涵盖依赖生成、项目打包、环境配置、服务启动、外网访问及后台静默运行等关键步骤,帮你避坑稳走每一步!
二、本地准备:依赖清单生成与项目打包
部署前需在本地完成 依赖清单生成 和 项目打包,确保服务器环境与本地一致,避免文件遗漏。
1. 生成 requirements.txt(依赖清单)
requirements.txt
用于记录项目所有依赖库及版本,是服务器安装依赖的“说明书”。
操作步骤:
-
激活本地虚拟环境(推荐使用虚拟环境隔离依赖):
- Windows 命令提示符:
# 进入本地项目根目录 cd D:\本地项目路径\flask_project # 激活虚拟环境(若用 venv 模块创建) venv\Scripts\activate
- Mac/Linux 终端:
cd /本地项目路径/flask_project source venv/bin/activate
- Windows 命令提示符:
-
生成依赖清单:
在虚拟环境激活状态下,执行以下命令,自动在项目根目录生成requirements.txt
:pip freeze > requirements.txt
-
检查文件内容:
打开requirements.txt
,确认包含项目所需依赖(如 Flask、数据库驱动等),示例:Flask==2.3.3 pymysql==1.1.0 dbutils==3.0.2 waitress==2.1.2 # 生产环境服务器依赖
2. 本地项目打包(压缩上传准备)
打包目的是将项目文件统一压缩,方便通过 FTP 工具上传到服务器,避免文件遗漏或传输错误。
操作步骤:
-
确认项目目录结构:
确保根目录包含所有必要文件,典型结构如下(根据实际项目调整):flask_project/ # 项目根目录 ├── app.py # Flask 入口文件(核心) ├── requirements.txt # 依赖清单(刚生成) ├── templates/ # HTML 模板目录 ├── static/ # 静态资源(CSS/JS/图片) ├── mysqlDao.py # 数据库操作模块(示例) └── config.py # 配置文件(示例)
-
排除无关文件:
打包前删除冗余文件,例如虚拟环境目录(venv/
)、本地日志(*.log
)、IDE 配置文件等。 -
压缩为 ZIP 包:
- Windows:右键项目根目录 → 发送到 → 压缩(zipped)文件夹,生成
flask_project.zip
。
- Windows:右键项目根目录 → 发送到 → 压缩(zipped)文件夹,生成
三、服务器部署全流程
1. 环境准备(Windows 服务器)
- 安装 Python:下载 Python 3.6+ 并勾选“Add Python to PATH”。
- 安装必备工具:
python -m pip install --upgrade pip pip install virtualenv # 可选,用于虚拟环境管理
2. 项目上传与解压
- 使用 WinSCP/FileZilla 将
flask_project.zip
上传到服务器目录(如D:\flask_project
)。 - 右键解压到目标目录,确保结构完整。
3. 虚拟环境与依赖安装
# 进入项目目录
cd D:\flask_project # 创建并激活虚拟环境
python -m venv venv
venv\Scripts\activate # 安装依赖
pip install -r requirements.txt
4. Flask 应用配置
- 设置环境变量:
set FLASK_APP=app.py # 指定入口文件
- 数据库配置检查:确保
mysqlDao.py
中数据库 IP、端口、账号等与服务器一致。
5. 启动 Flask 服务(Windows 兼容方案)
方式 1:开发环境(Flask 内置服务器)
flask run --host=0.0.0.0 --port=5000 # 绑定所有网卡,允许外网访问
方式 2:生产环境(Waitress 服务器)
pip install waitress # 安装生产级服务器
waitress-serve --host=0.0.0.0 --port=5000 app:app # 替代 gunicorn
6. 外网访问配置(关键步骤)
(1)防火墙开放端口
- 路径:控制面板 → 系统和安全 → Windows 防火墙 → 高级设置。
- 新建入站规则:允许 TCP 协议的 5000 端口(与服务端口一致)。
(2)端口映射(内网穿透)
- 登录路由器管理页,添加端口映射规则:
- 内网 IP:服务器局域网 IP(通过
ipconfig
获取)。 - 内外网端口:均设置为 5000。
- 内网 IP:服务器局域网 IP(通过
四、实现无窗口后台运行(静默启动)
在 Windows 服务器上,需让 Flask 应用脱离命令行窗口后台运行,推荐通过 批处理 + VBS 脚本 实现:
1. 创建批处理脚本(start_flask.bat)
在项目根目录新建 start_flask.bat
,内容如下:
@echo off
REM 强制切换到脚本所在目录(避免路径问题)
cd /d "%~dp0" REM 激活虚拟环境
call "venv\Scripts\activate.bat" REM 启动服务并输出日志(使用 Waitress 或 Flask 内置服务器)
waitress-serve --host=0.0.0.0 --port=5000 app:app > flask_log.txt 2>&1
REM 若用 Flask 内置服务器,替换为:
REM flask run --host=0.0.0.0 --port=5000 > flask_log.txt 2>&1
2. 创建 VBS 脚本(隐藏窗口)
新建 start_flask.vbs
,用于静默执行批处理脚本,内容如下:
方法 1:绝对路径(推荐,稳定不易错)
Set WshShell = CreateObject("WScript.Shell")
REM 直接指定批处理文件的绝对路径(加引号避免中文/空格问题)
WshShell.Run Chr(34) & "D:\flask_project\start_flask.bat" & Chr(34), 0
Set WshShell = Nothing
方法 2:相对路径(适合脚本与批处理同目录)
若 start_flask.vbs
与 start_flask.bat
在同一目录,可自动获取路径:
Set WshShell = CreateObject("WScript.Shell")
' 获取 VBS 脚本所在目录
scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
' 拼接批处理路径(同一目录)
batPath = scriptDir & "\start_flask.bat"
' 隐藏窗口运行
WshShell.Run Chr(34) & batPath & Chr(34), 0
Set WshShell = Nothing
3. 启动与停止方式
- 启动:双击
start_flask.vbs
,无窗口弹出即表示成功运行。 - 停止:打开任务管理器,找到
python.exe
或pythonw.exe
进程(对应 Flask 服务),右键结束任务。
4. 注意事项
- 路径问题:确保
bat
和vbs
脚本中的路径无中文/空格,或用引号包裹路径。 - 日志查看:通过
flask_log.txt
查看服务输出,排查启动失败原因。 - 稳定性:生产环境建议用
Waitress
替代 Flask 内置服务器,避免意外退出。
五、避坑指南(Windows 特有问题)
gunicorn
无法运行:用Waitress
替代,命令:waitress-serve --host=0.0.0.0 --port=5000 app:app
。- 外网访问失败:检查防火墙规则是否开放端口、路由器映射是否正确。
- 后台启动报错:确认
bat
脚本中虚拟环境路径正确,手动运行start_flask.bat
排查依赖问题。
六、部署流程
flowchart TDA[本地准备] --> B[生成 requirements.txt]A --> C[打包项目为 ZIP]C --> D[上传 ZIP 到服务器]D --> E[解压到服务器目录]E --> F[创建并激活虚拟环境]F --> G[安装依赖]G --> H[配置环境变量]H --> I[编写批处理与 VBS 脚本]I --> J[后台启动服务(双击 VBS)]J --> K[配置防火墙+端口映射]K --> L[外网访问测试]
七、总结
本文涵盖了 Flask 项目在 Windows 服务器部署的全流程,从本地依赖生成、项目打包到服务器环境配置、外网访问,再到无窗口后台运行,核心是解决 Windows 兼容性问题(如用 Waitress
替代 gunicorn
)和路径配置问题。按步骤操作,即可实现稳定的 Flask 项目部署。遇到问题欢迎留言交流!