2025-07-29 18:28:40 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
"""
|
|
|
|
|
身体平衡评估系统 - 调试服务器启动脚本
|
|
|
|
|
|
|
|
|
|
这个脚本专门用于调试模式,提供更好的调试体验:
|
|
|
|
|
1. 支持IDE断点调试
|
|
|
|
|
2. 详细的错误信息输出
|
|
|
|
|
3. 热重载功能
|
|
|
|
|
4. 调试日志输出
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import logging
|
2025-08-02 16:52:17 +08:00
|
|
|
|
import socket
|
2025-07-29 18:28:40 +08:00
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
# 添加项目路径
|
|
|
|
|
project_root = Path(__file__).parent
|
|
|
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
|
sys.path.insert(0, str(project_root / 'backend'))
|
|
|
|
|
|
|
|
|
|
def setup_debug_logging():
|
|
|
|
|
"""设置调试日志"""
|
|
|
|
|
# 创建logs目录
|
|
|
|
|
logs_dir = project_root / 'logs'
|
|
|
|
|
logs_dir.mkdir(exist_ok=True)
|
|
|
|
|
|
|
|
|
|
# 配置日志格式
|
|
|
|
|
logging.basicConfig(
|
|
|
|
|
level=logging.DEBUG,
|
|
|
|
|
format='%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
|
|
|
|
|
handlers=[
|
|
|
|
|
logging.FileHandler(logs_dir / 'debug.log', encoding='utf-8'),
|
|
|
|
|
logging.StreamHandler(sys.stdout)
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 设置Flask和SocketIO的日志级别
|
|
|
|
|
logging.getLogger('werkzeug').setLevel(logging.DEBUG)
|
|
|
|
|
logging.getLogger('socketio').setLevel(logging.DEBUG)
|
|
|
|
|
logging.getLogger('engineio').setLevel(logging.DEBUG)
|
|
|
|
|
|
2025-08-12 14:33:20 +08:00
|
|
|
|
# 禁用第三方库的详细日志
|
|
|
|
|
logging.getLogger('PIL').setLevel(logging.WARNING)
|
|
|
|
|
logging.getLogger('PIL.PngImagePlugin').setLevel(logging.WARNING)
|
|
|
|
|
logging.getLogger('matplotlib').setLevel(logging.WARNING)
|
|
|
|
|
logging.getLogger('matplotlib.font_manager').setLevel(logging.WARNING)
|
|
|
|
|
|
2025-07-29 18:28:40 +08:00
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
logger.info('调试日志已启用')
|
|
|
|
|
return logger
|
|
|
|
|
|
2025-08-02 16:52:17 +08:00
|
|
|
|
def get_local_ip():
|
|
|
|
|
"""获取本机IP地址"""
|
|
|
|
|
try:
|
|
|
|
|
# 创建一个UDP socket连接到外部地址来获取本机IP
|
|
|
|
|
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
|
|
|
|
s.connect(("8.8.8.8", 80))
|
|
|
|
|
return s.getsockname()[0]
|
|
|
|
|
except Exception:
|
|
|
|
|
return "127.0.0.1"
|
|
|
|
|
|
2025-07-29 18:28:40 +08:00
|
|
|
|
def check_debug_environment():
|
|
|
|
|
"""检查调试环境"""
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# 检查Python版本
|
|
|
|
|
if sys.version_info < (3, 8):
|
|
|
|
|
logger.error('需要Python 3.8或更高版本')
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# 检查必要文件
|
|
|
|
|
required_files = [
|
|
|
|
|
'backend/app.py',
|
2025-08-02 16:52:17 +08:00
|
|
|
|
'config.ini',
|
2025-07-29 18:28:40 +08:00
|
|
|
|
'backend/requirements.txt'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
for file_path in required_files:
|
|
|
|
|
if not (project_root / file_path).exists():
|
|
|
|
|
logger.error(f'缺少必要文件: {file_path}')
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
logger.info('调试环境检查通过')
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def start_debug_server():
|
|
|
|
|
"""启动调试服务器"""
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 设置环境变量
|
|
|
|
|
os.environ['FLASK_ENV'] = 'development'
|
|
|
|
|
os.environ['FLASK_DEBUG'] = '1'
|
|
|
|
|
os.environ['PYTHONPATH'] = str(project_root)
|
|
|
|
|
|
|
|
|
|
# 导入Flask应用
|
|
|
|
|
from backend.app import app, socketio, init_app
|
|
|
|
|
|
|
|
|
|
# 初始化应用
|
|
|
|
|
logger.info('初始化应用...')
|
|
|
|
|
init_app()
|
|
|
|
|
|
2025-08-02 16:52:17 +08:00
|
|
|
|
# 获取本机IP地址
|
|
|
|
|
local_ip = get_local_ip()
|
|
|
|
|
|
2025-07-29 18:28:40 +08:00
|
|
|
|
# 启动调试服务器
|
|
|
|
|
logger.info('启动调试服务器...')
|
|
|
|
|
logger.info('调试模式已启用 - 可以在IDE中设置断点')
|
2025-08-02 16:52:17 +08:00
|
|
|
|
logger.info('本地访问: http://127.0.0.1:5000')
|
|
|
|
|
logger.info(f'远程访问: http://{local_ip}:5000')
|
2025-07-29 18:28:40 +08:00
|
|
|
|
logger.info('健康检查: http://127.0.0.1:5000/health')
|
|
|
|
|
logger.info('按 Ctrl+C 停止服务器')
|
|
|
|
|
|
2025-08-02 16:52:17 +08:00
|
|
|
|
# 启动SocketIO服务器(支持调试和远程访问)
|
2025-07-29 18:28:40 +08:00
|
|
|
|
socketio.run(
|
|
|
|
|
app,
|
2025-08-02 16:52:17 +08:00
|
|
|
|
host='0.0.0.0', # 允许所有IP访问
|
2025-07-29 18:28:40 +08:00
|
|
|
|
port=5000,
|
|
|
|
|
debug=True,
|
2025-08-03 21:50:50 +08:00
|
|
|
|
use_reloader=False, # 禁用热重载以避免FemtoBolt设备资源冲突
|
2025-07-29 18:28:40 +08:00
|
|
|
|
log_output=True, # 输出详细日志
|
|
|
|
|
allow_unsafe_werkzeug=True
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
logger.info('服务器被用户中断')
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f'服务器启动失败: {e}', exc_info=True)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
"""主函数"""
|
|
|
|
|
print('='*50)
|
|
|
|
|
print('身体平衡评估系统 - 调试模式')
|
|
|
|
|
print('='*50)
|
|
|
|
|
print()
|
|
|
|
|
|
|
|
|
|
# 设置调试日志
|
|
|
|
|
logger = setup_debug_logging()
|
|
|
|
|
|
|
|
|
|
# 检查环境
|
|
|
|
|
if not check_debug_environment():
|
|
|
|
|
input('按任意键退出...')
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
# 启动调试服务器
|
|
|
|
|
success = start_debug_server()
|
|
|
|
|
|
|
|
|
|
if not success:
|
|
|
|
|
input('按任意键退出...')
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|