Buckets:
| import json | |
| from typing import Callable | |
| from threading import Thread | |
| from http.server import BaseHTTPRequestHandler, HTTPServer | |
| from urllib.parse import urlparse, parse_qs | |
| # 运行服务器在子线程上 | |
| class SubThreadAPIServer: | |
| def __init__(self, port_range: tuple[int, int] = (8000, 8010), request_handler_class: type[BaseHTTPRequestHandler] = BaseHTTPRequestHandler): | |
| self.port_range = port_range | |
| self.RequestHandlerClass = request_handler_class | |
| def run(self): | |
| for port in range(*self.port_range): | |
| try: | |
| server = HTTPServer(("", port), self.RequestHandlerClass) | |
| print(f"Server started on port {port}") | |
| break | |
| except OSError: | |
| print(f"Port {port} is in use, trying next port...") | |
| else: | |
| print("Could not find an available port in the specified range.") | |
| return | |
| server_thread = Thread(target=server.serve_forever, daemon=True) | |
| server_thread.start() | |
| def handle_hello(self: "APIHandler"): | |
| query = parse_qs(urlparse(self.path).query) | |
| name = query.get("name", ["World"])[0] | |
| self.send_response(200, {"message": f"Hello, {name}!"}) | |
| def handle_post_data(self: "APIHandler"): | |
| content_length = int(self.headers["Content-Length"]) | |
| post_data = self.rfile.read(content_length) | |
| try: | |
| data = json.loads(post_data) | |
| response = { | |
| "status": "received", | |
| "your_data": data, | |
| "method": "POST", | |
| } | |
| self.send_response(201, response) | |
| except json.JSONDecodeError: | |
| self.send_response(400, {"error": "Invalid JSON"}) | |
| def handle_post_get_data_from_blender(self: "APIHandler"): | |
| length = int(self.headers["Content-Length"]) | |
| post_data = self.rfile.read(length) | |
| try: | |
| data: dict = json.loads(post_data) | |
| except json.JSONDecodeError: | |
| self.send_response(400, {"error": "Invalid JSON"}) | |
| return | |
| event = data.get("event") | |
| if event == "echo": | |
| self.send_response(200) | |
| elif event == "run": | |
| unique_id = data.get("unique_id", "") | |
| data_name = data.get("message", {}).get("data_name") | |
| data_result = 1 | |
| # 测试 | |
| if data_name == "active_model": | |
| data_result = "3d/未命名.glb" | |
| resp_json = { | |
| "unique_id": unique_id, | |
| "message": { | |
| "data_name": data_name, | |
| "data_result": data_result, | |
| }, | |
| "event": "run", | |
| } | |
| print("Received data from ComfyUI: ", data) | |
| self.send_response(201, resp_json) | |
| else: | |
| self.send_response(400, {"error": "Invalid event"}) | |
| class APIHandler(BaseHTTPRequestHandler): | |
| # 路由 | |
| routes: dict[str, dict[str, Callable[["APIHandler"], None]]] = { | |
| "GET": { | |
| "/api/hello": handle_hello, | |
| }, | |
| "POST": { | |
| "/api/data": handle_post_data, | |
| "/api/get_data_from_blender": handle_post_get_data_from_blender, | |
| }, | |
| } | |
| # 通用响应方法 | |
| def send_response(self, status_code, data=None): | |
| super().send_response(status_code) | |
| self.send_header("Content-type", "application/json") | |
| self.send_header("Access-Control-Allow-Origin", "*") # 跨域 | |
| self.end_headers() | |
| if data: | |
| self.wfile.write(json.dumps(data).encode()) | |
| # 路由分发器 | |
| def handle_request(self): | |
| parsed_path = urlparse(self.path).path | |
| method = self.command | |
| # 查找路由对应的处理函数 | |
| handler = self.routes.get(method, {}).get(parsed_path, None) | |
| if handler: | |
| handler(self) | |
| else: | |
| self.send_response(404, {"error": "Endpoint not found"}) | |
| def do_GET(self): | |
| self.handle_request() | |
| def do_POST(self): | |
| self.handle_request() | |
| if __name__ == "__main__": | |
| BLENDER_IO_PORT_RANGE = (53819, 53824) | |
| BLENDER_IO_PORT_RANGE = (8000, 53824) | |
| server = SubThreadAPIServer(port_range=BLENDER_IO_PORT_RANGE, request_handler_class=APIHandler) | |
| server.run() | |
| # port = BLENDER_IO_PORT_RANGE[0] | |
| # server_address = ("", port) | |
| # httpd = HTTPServer(server_address, APIHandler) | |
| # httpd.serve_forever() | |
Xet Storage Details
- Size:
- 4.4 kB
- Xet hash:
- 57a0fb03b237f68c9b50012b6cd41be7471763c76096390ff3223dba31103613
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.