Files
aitsc/flask_prompt_master_service.py

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()