116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
Flask 提示词大师 Windows 服务
|
|||
|
|
用于将应用注册为 Windows 系统服务,实现开机自启动
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
import time
|
|||
|
|
import logging
|
|||
|
|
import win32serviceutil
|
|||
|
|
import win32service
|
|||
|
|
import win32event
|
|||
|
|
import servicemanager
|
|||
|
|
import socket
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
# 添加项目路径到 Python 路径
|
|||
|
|
project_root = Path(__file__).parent
|
|||
|
|
sys.path.insert(0, str(project_root))
|
|||
|
|
|
|||
|
|
from src.flask_prompt_master import create_app
|
|||
|
|
|
|||
|
|
class FlaskPromptMasterService(win32serviceutil.ServiceFramework):
|
|||
|
|
"""Flask 提示词大师 Windows 服务类"""
|
|||
|
|
|
|||
|
|
_svc_name_ = "FlaskPromptMaster"
|
|||
|
|
_svc_display_name_ = "Flask 提示词大师服务"
|
|||
|
|
_svc_description_ = "Flask 提示词大师 Web 应用服务,提供提示词生成功能"
|
|||
|
|
|
|||
|
|
def __init__(self, args):
|
|||
|
|
win32serviceutil.ServiceFramework.__init__(self, args)
|
|||
|
|
self.stop_event = win32event.CreateEvent(None, 0, 0, None)
|
|||
|
|
self.app = None
|
|||
|
|
self.server = None
|
|||
|
|
|
|||
|
|
# 配置日志
|
|||
|
|
self.setup_logging()
|
|||
|
|
|
|||
|
|
def setup_logging(self):
|
|||
|
|
"""配置服务日志"""
|
|||
|
|
log_dir = project_root / "logs"
|
|||
|
|
log_dir.mkdir(exist_ok=True)
|
|||
|
|
|
|||
|
|
logging.basicConfig(
|
|||
|
|
level=logging.INFO,
|
|||
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|||
|
|
handlers=[
|
|||
|
|
logging.FileHandler(log_dir / "service.log", encoding='utf-8'),
|
|||
|
|
logging.StreamHandler()
|
|||
|
|
]
|
|||
|
|
)
|
|||
|
|
self.logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
def SvcStop(self):
|
|||
|
|
"""停止服务"""
|
|||
|
|
self.logger.info("正在停止 Flask 提示词大师服务...")
|
|||
|
|
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
|
|||
|
|
win32event.SetEvent(self.stop_event)
|
|||
|
|
|
|||
|
|
if self.server:
|
|||
|
|
self.server.shutdown()
|
|||
|
|
|
|||
|
|
def SvcDoRun(self):
|
|||
|
|
"""运行服务"""
|
|||
|
|
try:
|
|||
|
|
self.logger.info("正在启动 Flask 提示词大师服务...")
|
|||
|
|
|
|||
|
|
# 设置环境变量
|
|||
|
|
os.environ['FLASK_ENV'] = 'production'
|
|||
|
|
os.environ['PYTHONPATH'] = str(project_root)
|
|||
|
|
|
|||
|
|
# 创建应用实例
|
|||
|
|
self.app = create_app()
|
|||
|
|
|
|||
|
|
# 启动服务器
|
|||
|
|
self.logger.info("服务启动成功,监听端口 5000")
|
|||
|
|
self.app.run(
|
|||
|
|
host='0.0.0.0',
|
|||
|
|
port=5000,
|
|||
|
|
debug=False,
|
|||
|
|
threaded=True,
|
|||
|
|
use_reloader=False
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
self.logger.error(f"服务启动失败: {e}")
|
|||
|
|
raise
|
|||
|
|
|
|||
|
|
def log_service_status(self):
|
|||
|
|
"""记录服务状态"""
|
|||
|
|
try:
|
|||
|
|
# 测试健康检查
|
|||
|
|
import requests
|
|||
|
|
response = requests.get('http://localhost:5000/health', timeout=5)
|
|||
|
|
if response.status_code == 200:
|
|||
|
|
self.logger.info("服务运行正常")
|
|||
|
|
else:
|
|||
|
|
self.logger.warning(f"健康检查失败: {response.status_code}")
|
|||
|
|
except Exception as e:
|
|||
|
|
self.logger.error(f"健康检查异常: {e}")
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""主函数"""
|
|||
|
|
if len(sys.argv) == 1:
|
|||
|
|
# 作为服务运行
|
|||
|
|
servicemanager.Initialize()
|
|||
|
|
servicemanager.PrepareToHostSingle(FlaskPromptMasterService)
|
|||
|
|
servicemanager.StartServiceCtrlDispatcher()
|
|||
|
|
else:
|
|||
|
|
# 命令行操作
|
|||
|
|
win32serviceutil.HandleCommandLine(FlaskPromptMasterService)
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
main()
|