diff --git a/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/__init__.py b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/__init__.py index d5ca784..658ac96 100644 --- a/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/__init__.py +++ b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/__init__.py @@ -41,6 +41,7 @@ UserContext, ) +from .json_sanitize import install_json_sanitize from .path_proxy import DynamicPathProxy from .folder_paths_patch import install_folder_paths_patch from .execution_patch import install_execution_patch @@ -61,6 +62,8 @@ if ENABLE_PLUGIN: try: + # JSON 补丁必须最早安装(在 server 处理 /object_info 之前生效) + install_json_sanitize() # Install all patches install_folder_paths_patch() install_execution_patch() diff --git a/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/json_sanitize.py b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/json_sanitize.py new file mode 100644 index 0000000..fcb4acc --- /dev/null +++ b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/json_sanitize.py @@ -0,0 +1,72 @@ +""" +JSON 序列化辅助 - 将 DynamicPathProxy 转为字符串 + +ComfyUI /object_info 经 aiohttp.web.json_response → json.dumps; +仅 patch web.json_response 不够(server 模块可能已绑定旧引用)。 +同时 patch json.JSONEncoder.default,确保所有标准 json.dumps 都能序列化 Proxy。 +""" + +import json + +from aiohttp import web + +from .path_proxy import DynamicPathProxy + +_installed = False +_original_encoder_default = None +_original_json_response = None + + +def sanitize_for_json(obj): + """递归将 DynamicPathProxy 转为 str(按当前 user 上下文解析路径)。""" + if isinstance(obj, DynamicPathProxy): + return str(obj) + if isinstance(obj, dict): + return {sanitize_for_json(k): sanitize_for_json(v) for k, v in obj.items()} + if isinstance(obj, (list, tuple)): + return [sanitize_for_json(x) for x in obj] + return obj + + +def install_json_sanitize(): + """ + 安装 JSON 序列化补丁(幂等)。 + + 1. json.JSONEncoder.default — 覆盖 aiohttp 内部的 json.dumps(data) + 2. aiohttp.web.json_response — 双保险,先 sanitize 再 dumps + 3. server.web.json_response — 若 server 已 import,同步替换 + """ + global _installed, _original_encoder_default, _original_json_response + + if _installed: + return + + _original_encoder_default = json.JSONEncoder.default + + def patched_encoder_default(self, o): + if isinstance(o, DynamicPathProxy): + return str(o) + return _original_encoder_default(self, o) + + json.JSONEncoder.default = patched_encoder_default + + _original_json_response = web.json_response + + def json_response_safe(data, **kwargs): + return _original_json_response(sanitize_for_json(data), **kwargs) + + json_response_safe._comfyui_user_json_patched = True + web.json_response = json_response_safe + + try: + import server # type: ignore + + server.web.json_response = json_response_safe + except ImportError: + pass + + _installed = True + print("[ComfyUI-Multi-User] JSON sanitize 已安装 (JSONEncoder.default + json_response)") + + +__all__ = ['sanitize_for_json', 'install_json_sanitize'] diff --git a/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/server_patch.py b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/server_patch.py index 448368c..f12a121 100644 --- a/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/server_patch.py +++ b/src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/server_patch.py @@ -8,6 +8,7 @@ from aiohttp import web from .context import set_current_user, clear_current_user +from .json_sanitize import install_json_sanitize _hook_installed = False @@ -47,6 +48,23 @@ def install_server_middleware(): try: import server # type: ignore + install_json_sanitize() + + # Save original add_routes method + _original_add_routes = server.PromptServer.add_routes + + def patched_add_routes(self): + """ + Patched add_routes - wraps handlers after route registration. + """ + # Call original add_routes first + result = _original_add_routes(self) + + # Wrap all route handlers + wrap_route_handlers(self.app) + + return result + instance = server.PromptServer.instance if instance is None: print("[ComfyUI-Multi-User] ⚠️ PromptServer instance not yet created, deferring middleware install")