52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
from typing import Generic, TypeVar, Optional, List
|
|
# from fastapi import FastAPI, HTTPException, status
|
|
from fastapi.responses import JSONResponse
|
|
from fastapi.encoders import jsonable_encoder
|
|
from pydantic import BaseModel, Field
|
|
from pydantic.generics import GenericModel
|
|
|
|
# 定义泛型类型
|
|
T = TypeVar('T')
|
|
|
|
class BaseResponse(GenericModel, Generic[T]):
|
|
code: int = Field(..., description="状态码")
|
|
msg: str = Field(..., description="描述信息")
|
|
data: Optional[T] = Field(None, description="响应数据")
|
|
|
|
class Config:
|
|
json_encoders = {
|
|
# 如果有需要自定义类型编码可以在这里添加
|
|
}
|
|
|
|
def response_format(*, code=200, message="success", data=None):
|
|
return JSONResponse(
|
|
status_code=code,
|
|
content=jsonable_encoder({
|
|
"code": code,
|
|
"msg": message,
|
|
"data": data
|
|
})
|
|
)
|
|
|
|
# 可以继承BaseResponse类来扩展字段
|
|
class PaginatedResponse(BaseResponse[List[T]]):
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
# # 使用示例
|
|
# @router.get("/paginated", response_model=PaginatedResponse[UserSchema])
|
|
# async def get_paginated_users():
|
|
# users, total = get_paginated_users()
|
|
# return PaginatedResponse(
|
|
# code=200,
|
|
# msg="success",
|
|
# data=users,
|
|
# total=total,
|
|
# page=1,
|
|
# page_size=20
|
|
# )
|
|
|
|
|