From 4ba6a77ecd723d8e3e8e61dab5d94578905fe96c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 16 Jan 2026 11:27:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20base=20=E5=AF=B9uploadfile=E7=9A=84log?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/utils/mixins.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/utils/mixins.py b/apps/utils/mixins.py index 0ceda35..555fb29 100755 --- a/apps/utils/mixins.py +++ b/apps/utils/mixins.py @@ -19,6 +19,7 @@ from rest_framework.decorators import action from apps.utils.serializers import ComplexSerializer from django.db.models import F from django.db import transaction +from django.core.files.uploadedfile import UploadedFile # 实例化myLogger myLogger = logging.getLogger('log') @@ -494,6 +495,14 @@ class MyLoggingMixin(object): if isinstance(data, list): return [self._clean_data(d) for d in data] + # Uploaded files: convert to metadata so JSON serialization won't fail + if isinstance(data, UploadedFile): + return { + "filename": getattr(data, "name", None), + "content_type": getattr(data, "content_type", None), + "size": getattr(data, "size", None), + } + if isinstance(data, dict): SENSITIVE_FIELDS = { "api", @@ -511,12 +520,28 @@ class MyLoggingMixin(object): } for key, value in data.items(): + # convert uploaded files in dict values + if isinstance(value, UploadedFile): + data[key] = { + "filename": getattr(value, "name", None), + "content_type": getattr(value, "content_type", None), + "size": getattr(value, "size", None), + } + continue try: value = ast.literal_eval(value) - except (ValueError, SyntaxError): + except (ValueError, SyntaxError, TypeError): pass if isinstance(value, (list, dict)): data[key] = self._clean_data(value) if key.lower() in SENSITIVE_FIELDS: data[key] = self.CLEANED_SUBSTITUTE + # Fallback: ensure returned data is JSON-serializable by converting + # unknown object types to strings + if not isinstance(data, (dict, list, str, int, float, bool, type(None))): + try: + return str(data) + except Exception: + return None + return data