From cd0f7d89f2f9a207a2bcc06c0871f05d4e248838 Mon Sep 17 00:00:00 2001 From: chakcy <947105045@qq.com> Date: Tue, 28 Jul 2026 15:45:01 +0800 Subject: [PATCH] =?UTF-8?q?modify:=20=E4=B8=8A=E6=8A=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20422=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chongming/app/__init__.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/chongming/app/__init__.py b/src/chongming/app/__init__.py index 839708b..bf139cd 100644 --- a/src/chongming/app/__init__.py +++ b/src/chongming/app/__init__.py @@ -12,6 +12,7 @@ import asyncio from contextlib import asynccontextmanager from fastapi import FastAPI, Request +from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from fastapi.middleware.cors import CORSMiddleware @@ -156,6 +157,35 @@ async def root(): } +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request: Request, exc: RequestValidationError): + """ + 请求验证异常处理器,记录详细的验证错误信息和请求体。 + 帮助快速定位 Pydantic 模型与前端/设备上报数据的不匹配问题。 + """ + body = None + try: + body = await request.body() + body_str = body.decode("utf-8")[:2000] if body else "" + except Exception: + body_str = "" + + errors = exc.errors() + error_summary = [ + f"{' -> '.join(str(loc) for loc in e['loc'])}: {e['msg']}" + for e in errors + ] + logger.error( + f"请求验证失败 [{request.method} {request.url.path}]:\n" + f" 错误: {'; '.join(error_summary)}\n" + f" 请求体: {body_str}" + ) + return JSONResponse( + status_code=422, + content={"detail": errors}, + ) + + @app.exception_handler(Exception) async def global_exception_handler(_: Request, exc: Exception): """