ComfyUI-WorkflowPublisher/workflow_server_demo.py

109 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import threading
import urllib
# "数据库" 和线程锁保持不变
WORKFLOWS_DB = {}
db_lock = threading.Lock()
class SimpleAPIHandler(BaseHTTPRequestHandler):
def _send_cors_headers(self):
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS') # 添加 DELETE
self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type")
def do_OPTIONS(self):
self.send_response(200, "ok")
self._send_cors_headers()
self.end_headers()
def do_GET(self):
# ... (do_GET 保持不变) ...
if self.path == '/api/workflow':
self.send_response(200)
self.send_header('Content-type', 'application/json')
self._send_cors_headers()
self.end_headers()
with db_lock:
response_data = list(WORKFLOWS_DB.values())
self.wfile.write(json.dumps(response_data).encode())
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b'Not Found')
def do_POST(self):
# ... (do_POST 保持不变) ...
if self.path == '/api/workflow':
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
try:
data = json.loads(post_data)
name = data.get('name')
workflow_data = data.get('workflow')
if not name or not workflow_data:
raise ValueError("Missing 'name' or 'workflow' in request body")
with db_lock:
WORKFLOWS_DB[name] = {"name": name, "workflow": workflow_data}
print(f"--- Received/Updated workflow: {name} ---")
self.send_response(200)
self.send_header('Content-type', 'application/json')
self._send_cors_headers()
self.end_headers()
self.wfile.write(json.dumps({"status": "received", "name": name}).encode())
except Exception as e:
self.send_response(400);
self.end_headers();
self.wfile.write(f'Bad Request: {e}'.encode())
else:
self.send_response(404);
self.end_headers();
self.wfile.write(b'Not Found')
# --- [核心新增] 添加 do_DELETE 方法 ---
def do_DELETE(self):
"""处理删除指定工作流的请求"""
# 我们期望的路径格式: /api/workflow/工作流名称[版本号]
parts = self.path.split('/api/workflow/')
if len(parts) == 2 and parts[1]:
# URL解码工作流名称因为它可能包含空格等特殊字符
workflow_name_to_delete = urllib.parse.unquote(parts[1])
with db_lock:
if workflow_name_to_delete in WORKFLOWS_DB:
del WORKFLOWS_DB[workflow_name_to_delete]
print(f"--- Deleted workflow: {workflow_name_to_delete} ---")
self.send_response(200)
self.send_header('Content-type', 'application/json')
self._send_cors_headers()
self.end_headers()
self.wfile.write(json.dumps({"status": "deleted", "name": workflow_name_to_delete}).encode())
else:
# 如果找不到要删除的工作流
self.send_response(404)
self._send_cors_headers()
self.end_headers()
self.wfile.write(json.dumps({"status": "error", "message": "Workflow not found"}).encode())
else:
self.send_response(400)
self._send_cors_headers()
self.end_headers()
self.wfile.write(b'Bad Request: Invalid delete path')
def run(server_class=HTTPServer, handler_class=SimpleAPIHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"测试API服务器已在 http://localhost:{port} 上启动...")
print(" - POST /api/workflow: 发布新工作流")
print(" - GET /api/workflow: 获取所有工作流")
print(" - DELETE /api/workflow/<name>: 删除指定工作流")
httpd.serve_forever()
if __name__ == '__main__':
run()