From c52f38e3342f2f795c8b935d2d49b424475f8ec7 Mon Sep 17 00:00:00 2001 From: "yinsu.zs" Date: Thu, 21 May 2026 14:00:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(multi-user):=20=E4=BF=AE=E5=A4=8D=20/object?= =?UTF-8?q?=5Finfo=20=E6=97=A0=E6=B3=95=E5=BA=8F=E5=88=97=E5=8C=96=20Dynam?= =?UTF-8?q?icPathProxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 多租插件将 folder_paths 目录改为 DynamicPathProxy 后,部分节点在 INPUT_TYPES() 中直接暴露该对象,导致 get_object_info 的 json.dumps 失败。 在插件加载时 patch JSONEncoder.default 与 web.json_response,将 Proxy 递归转为 str,保留运行时多用户路径隔离行为。 Change-Id: I032ae76cf6b8678ced88f2c152e4ebec97c95ad3 Co-developed-by: Cursor --- .../FunArt-ComfyUI-Multi-User/__init__.py | 3 + .../json_sanitize.py | 72 +++++++++++++++++++ .../FunArt-ComfyUI-Multi-User/server_patch.py | 3 + 3 files changed, 78 insertions(+) create mode 100644 src/code/comfyui/custom_nodes/FunArt-ComfyUI-Multi-User/json_sanitize.py 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 73e4440c..2c3f78b5 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 @@ -40,6 +40,7 @@ UserContext, ) +from .json_sanitize import install_json_sanitize from .folder_paths_patch import install_folder_paths_patch from .execution_patch import install_execution_patch from .cache_signature_patch import install_cache_signature_patch @@ -59,6 +60,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 00000000..fcb4acc8 --- /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 569063a9..b4df6be2 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 @@ -5,6 +5,7 @@ """ from .context import set_current_user, clear_current_user +from .json_sanitize import install_json_sanitize _hook_installed = False _original_add_routes = None @@ -26,6 +27,8 @@ def install_server_middleware(): try: import server # type: ignore + install_json_sanitize() + # Save original add_routes method _original_add_routes = server.PromptServer.add_routes