diff --git a/app/core/response.py b/app/core/response.py index 21165fe..4adcfa8 100644 --- a/app/core/response.py +++ b/app/core/response.py @@ -1,21 +1,47 @@ from typing import Any, Optional from fastapi.responses import JSONResponse -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict +from datetime import datetime +from typing import TypeVar, Generic +from fastapi import status +import json + +class CustomJSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime): + return obj.strftime('%Y-%m-%d %H:%M:%S') + return super().default(obj) + +class CustomJSONResponse(JSONResponse): + def render(self, content) -> bytes: + return json.dumps( + content, + ensure_ascii=False, + allow_nan=False, + indent=None, + separators=(",", ":"), + cls=CustomJSONEncoder + ).encode("utf-8") + class ResponseModel(BaseModel): - code: int = 200 + code: int = status.HTTP_200_OK message: str = "success" data: Optional[Any] = None -def success_response(*, data: Any = None, message: str = "success") -> dict: + def json_response(self): + return CustomJSONResponse(content=self.model_dump()) + + +def success_response(*, data: Any = None, message: str = "success") -> CustomJSONResponse: return ResponseModel( - code=200, + code=status.HTTP_200_OK, message=message, data=data - ).model_dump() + ).json_response() -def error_response(*, code: int = 400, message: str) -> dict: +def error_response(*, code: int = 400, message: str) -> CustomJSONResponse: return ResponseModel( code=code, message=message - ).model_dump() \ No newline at end of file + ).json_response() \ No newline at end of file diff --git a/app/main.py b/app/main.py index c09505f..0c2cccf 100644 --- a/app/main.py +++ b/app/main.py @@ -7,6 +7,7 @@ from fastapi.responses import JSONResponse from app.core.response import error_response from fastapi import HTTPException from app.middleware.request_logger import RequestLoggerMiddleware +from app.core.response import CustomJSONResponse # 创建数据库表 Base.metadata.create_all(bind=engine) @@ -14,8 +15,9 @@ Base.metadata.create_all(bind=engine) app = FastAPI( title="Beefast 蜂快到家", description="API 文档", - version="1.0.0" -) + version="1.0.0") + +app.default_response_class = CustomJSONResponse # 配置 CORS app.add_middleware(