167 lines
5.4 KiB
Django/Jinja
167 lines
5.4 KiB
Django/Jinja
|
|
# Python HTTP服务包装器
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
import time
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
|
|
# 添加项目路径到Python路径
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
# 尝试导入算法模块
|
|
try:
|
|
# 根据入口点导入算法
|
|
if "{{entry_point}}" == "":
|
|
# 尝试导入主要模块
|
|
import algorithm
|
|
algorithm_module = algorithm
|
|
else:
|
|
# 动态导入入口点
|
|
import importlib.util
|
|
spec = importlib.util.spec_from_file_location("algorithm_module", "{{entry_point}}")
|
|
algorithm_module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(algorithm_module)
|
|
print("算法模块导入成功")
|
|
except Exception as e:
|
|
print(f"算法模块导入失败: {e}")
|
|
algorithm_module = None
|
|
|
|
# 服务配置
|
|
HOST = os.environ.get("HOST", "{{host}}")
|
|
PORT = int(os.environ.get("PORT", "{{port}}"))
|
|
TIMEOUT = int(os.environ.get("TIMEOUT", "{{timeout}}"))
|
|
|
|
class AlgorithmRequestHandler(BaseHTTPRequestHandler):
|
|
"""算法请求处理器"""
|
|
|
|
def do_POST(self):
|
|
"""处理POST请求"""
|
|
try:
|
|
# 读取请求体
|
|
content_length = int(self.headers['Content-Length'])
|
|
post_data = self.rfile.read(content_length)
|
|
|
|
# 解析请求数据
|
|
request_data = json.loads(post_data.decode('utf-8'))
|
|
|
|
# 记录请求开始时间
|
|
start_time = time.time()
|
|
|
|
# 调用算法
|
|
result = self._call_algorithm(request_data)
|
|
|
|
# 计算响应时间
|
|
response_time = time.time() - start_time
|
|
|
|
# 构建响应
|
|
response = {
|
|
"success": True,
|
|
"result": result,
|
|
"response_time": round(response_time, 4),
|
|
"message": "算法执行成功"
|
|
}
|
|
|
|
# 发送响应
|
|
self.send_response(200)
|
|
self.send_header('Content-type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(response).encode('utf-8'))
|
|
|
|
except Exception as e:
|
|
# 构建错误响应
|
|
error_response = {
|
|
"success": False,
|
|
"error": str(e),
|
|
"message": "算法执行失败"
|
|
}
|
|
|
|
# 发送错误响应
|
|
self.send_response(400)
|
|
self.send_header('Content-type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(error_response).encode('utf-8'))
|
|
|
|
def do_GET(self):
|
|
"""处理GET请求"""
|
|
if self.path == "{{health_check_path}}":
|
|
# 健康检查
|
|
self._handle_health_check()
|
|
elif self.path == "/info":
|
|
# 服务信息
|
|
self._handle_info()
|
|
else:
|
|
# 404响应
|
|
self.send_response(404)
|
|
self.send_header('Content-type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({"error": "Not Found"}).encode('utf-8'))
|
|
|
|
def _call_algorithm(self, request_data):
|
|
"""调用算法
|
|
|
|
Args:
|
|
request_data: 请求数据
|
|
|
|
Returns:
|
|
算法执行结果
|
|
"""
|
|
if algorithm_module is None:
|
|
raise Exception("算法模块未加载")
|
|
|
|
# 尝试调用算法的主要函数
|
|
try:
|
|
# 检查是否有predict函数
|
|
if hasattr(algorithm_module, 'predict'):
|
|
return algorithm_module.predict(request_data)
|
|
# 检查是否有run函数
|
|
elif hasattr(algorithm_module, 'run'):
|
|
return algorithm_module.run(request_data)
|
|
# 检查是否有main函数
|
|
elif hasattr(algorithm_module, 'main'):
|
|
return algorithm_module.main(request_data)
|
|
else:
|
|
raise Exception("未找到算法执行函数")
|
|
except Exception as e:
|
|
raise Exception(f"算法执行失败: {e}")
|
|
|
|
def _handle_health_check(self):
|
|
"""处理健康检查"""
|
|
self.send_response(200)
|
|
self.send_header('Content-type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({"status": "healthy", "service": "{{project_name}}"}).encode('utf-8'))
|
|
|
|
def _handle_info(self):
|
|
"""处理服务信息请求"""
|
|
info = {
|
|
"service": "{{project_name}}",
|
|
"version": "1.0.0",
|
|
"host": HOST,
|
|
"port": PORT,
|
|
"timeout": TIMEOUT,
|
|
"algorithm_loaded": algorithm_module is not None
|
|
}
|
|
|
|
self.send_response(200)
|
|
self.send_header('Content-type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(info).encode('utf-8'))
|
|
|
|
def run_server():
|
|
"""启动服务"""
|
|
server = HTTPServer((HOST, PORT), AlgorithmRequestHandler)
|
|
print(f"服务启动成功,监听地址: {HOST}:{PORT}")
|
|
print(f"健康检查地址: http://{HOST}:{PORT}{{health_check_path}}")
|
|
print(f"服务信息地址: http://{HOST}:{PORT}/info")
|
|
|
|
try:
|
|
server.serve_forever()
|
|
except KeyboardInterrupt:
|
|
print("服务停止")
|
|
server.shutdown()
|
|
|
|
if __name__ == "__main__":
|
|
run_server()
|