deliveryman-api/app/core/response.py
2025-02-14 22:14:36 +08:00

47 lines
1.3 KiB
Python

from typing import Any, Optional
from fastapi.responses import JSONResponse
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 = status.HTTP_200_OK
message: str = "success"
data: Optional[Any] = None
def json_response(self):
return CustomJSONResponse(content=self.model_dump())
def success_response(*, data: Any = None, message: str = "success") -> CustomJSONResponse:
return ResponseModel(
code=status.HTTP_200_OK,
message=message,
data=data
).json_response()
def error_response(*, code: int = 400, message: str) -> CustomJSONResponse:
return ResponseModel(
code=code,
message=message
).json_response()