200 lines
3.8 KiB
Markdown
200 lines
3.8 KiB
Markdown
# 最小功能测试框架
|
||
|
||
## 概述
|
||
|
||
这是一个最小功能测试框架,用于验证 Flask + SocketIO + threading 技术栈在打包成 exe 后的可用性。
|
||
|
||
## 功能特性
|
||
|
||
- ✅ Flask HTTP 服务
|
||
- ✅ SocketIO WebSocket 服务
|
||
- ✅ 强制使用 threading 异步模式
|
||
- ✅ 完整的前端测试界面
|
||
- ✅ HTTP API 测试
|
||
- ✅ WebSocket 连接测试
|
||
- ✅ 实时消息收发测试
|
||
- ✅ 系统信息显示
|
||
|
||
## 文件结构
|
||
|
||
```
|
||
install/
|
||
├── minimal_test_app.py # 主应用文件
|
||
├── build_minimal.py # 打包脚本
|
||
├── requirements_minimal.txt # 最小依赖列表
|
||
└── README.md # 说明文档
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements_minimal.txt
|
||
```
|
||
|
||
### 2. 测试运行
|
||
|
||
```bash
|
||
python minimal_test_app.py
|
||
```
|
||
|
||
然后在浏览器中访问 http://localhost:5000 进行测试。
|
||
|
||
### 3. 打包成 exe
|
||
|
||
```bash
|
||
python build_minimal.py
|
||
```
|
||
|
||
### 4. 测试 exe
|
||
|
||
打包完成后,运行:
|
||
|
||
```bash
|
||
# 方式1:直接运行
|
||
dist/MinimalTestApp.exe
|
||
|
||
# 方式2:使用脚本
|
||
dist/start_test.bat
|
||
```
|
||
|
||
## 测试步骤
|
||
|
||
### HTTP API 测试
|
||
|
||
1. 点击「测试 HTTP API」按钮
|
||
2. 确认返回成功响应
|
||
3. 检查响应数据包含服务器信息
|
||
|
||
### WebSocket 测试
|
||
|
||
1. 页面加载时会自动连接 WebSocket
|
||
2. 确认连接状态显示为「已连接」
|
||
3. 点击「发送测试消息」
|
||
4. 确认能收到服务器响应
|
||
5. 测试断开和重连功能
|
||
|
||
### 系统信息检查
|
||
|
||
- 服务器时间:确认时间正确
|
||
- SocketIO模式:确认显示为 "threading"
|
||
- Flask版本:确认版本信息
|
||
|
||
## 技术要点
|
||
|
||
### 异步模式选择
|
||
|
||
```python
|
||
# 强制使用 threading 模式,避免 eventlet/gevent 依赖问题
|
||
socketio = SocketIO(
|
||
app,
|
||
cors_allowed_origins='*',
|
||
async_mode='threading', # 关键配置
|
||
logger=False,
|
||
engineio_logger=False
|
||
)
|
||
```
|
||
|
||
### 打包配置
|
||
|
||
```python
|
||
# PyInstaller 隐藏导入配置
|
||
hiddenimports=[
|
||
'flask',
|
||
'flask_socketio',
|
||
'socketio',
|
||
'engineio',
|
||
'engineio.async_drivers.threading', # 关键:threading 驱动
|
||
'socketio.namespace',
|
||
'dns',
|
||
'dns.resolver',
|
||
'dns.asyncresolver'
|
||
],
|
||
# 排除不需要的异步模式
|
||
excludes=[
|
||
'eventlet',
|
||
'gevent',
|
||
'gevent_uwsgi'
|
||
]
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **"Invalid async_mode specified" 错误**
|
||
- 确认已安装所有依赖
|
||
- 检查 PyInstaller 隐藏导入配置
|
||
- 确认排除了不需要的异步模式
|
||
|
||
2. **WebSocket 连接失败**
|
||
- 检查防火墙设置
|
||
- 确认端口 5000 未被占用
|
||
- 查看控制台错误信息
|
||
|
||
3. **打包失败**
|
||
- 确认 PyInstaller 版本兼容
|
||
- 检查依赖版本冲突
|
||
- 查看详细错误输出
|
||
|
||
### 调试模式
|
||
|
||
如需调试,可以修改 `minimal_test_app.py`:
|
||
|
||
```python
|
||
# 启用调试模式
|
||
socketio.run(
|
||
app,
|
||
host='0.0.0.0',
|
||
port=5000,
|
||
debug=True, # 启用调试
|
||
allow_unsafe_werkzeug=True
|
||
)
|
||
```
|
||
|
||
## 扩展指南
|
||
|
||
### 添加新功能
|
||
|
||
1. **新增 HTTP 路由**
|
||
```python
|
||
@app.route('/api/new-endpoint')
|
||
def new_endpoint():
|
||
return jsonify({'message': 'New endpoint'})
|
||
```
|
||
|
||
2. **新增 SocketIO 事件**
|
||
```python
|
||
@socketio.on('new_event')
|
||
def handle_new_event(data):
|
||
emit('response', {'status': 'received'})
|
||
```
|
||
|
||
3. **添加依赖**
|
||
- 更新 `requirements_minimal.txt`
|
||
- 更新 `build_minimal.py` 中的 `hiddenimports`
|
||
- 重新测试打包
|
||
|
||
### 渐进式集成
|
||
|
||
按照以下顺序逐步添加业务功能:
|
||
|
||
1. ✅ 基础 Flask + SocketIO(当前阶段)
|
||
2. 🔄 添加数据库支持
|
||
3. 🔄 添加文件操作
|
||
4. 🔄 添加外部库依赖
|
||
5. 🔄 添加硬件设备支持
|
||
|
||
每个阶段都要确保打包和运行正常,出现问题时更容易定位。
|
||
|
||
## 版本信息
|
||
|
||
- Flask: 2.3.3
|
||
- Flask-SocketIO: 5.3.6
|
||
- PyInstaller: 6.1.0
|
||
- Python: 3.8+
|
||
|
||
## 许可证
|
||
|
||
MIT License |