AI掘金头条新闻系统 (Toutiao News)-封装通用成功响应格式

1. utils/response.py

python 复制代码
from typing import Any
from fastapi.encoders import jsonable_encoder
from starlette.responses import JSONResponse

# 成功响应结果
def success_response(message: str = "success", data: Any = None):
   content = {
       "code": 200,
       "message":message,
       "data":data
   }
   # 目标:把任何的 FastAPI、Pydantic、ORM对象 都要正常响应 + code、 message、 data
   return JSONResponse(content=jsonable_encoder(content))

2. schemas/users/py

python 复制代码
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional

# 用户信息基础数据模型
class UserInfoBase(BaseModel):
    nickname: Optional[str] = Field(None, max_length=50, description="昵称")
    avatar: Optional[str] = Field(None, max_length=255, description="头像URL")
    gender: Optional[str] = Field(None, max_length=10, description="性别")
    bio: Optional[str] = Field(None, max_length=500, description="个人简介")


class UserInfoResponse(UserInfoBase):
    id: int
    username: str

    # 模型类配置
    model_config = ConfigDict(
        from_attributes=True  # 允许从 ORM 对象属性中取值
    )


# data 数据类型
class UserAuthResponse(BaseModel):
    token: str
    user_info: UserInfoResponse = Field(..., alias="userInfo")

    # 模型类配置
    model_config = ConfigDict(
        populate_by_name=True,  # alias / 字段名兼容
        from_attributes=True   # 允许从 ORM 对象属性中取值
    )

完整代码

python 复制代码
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional

# 用户请求
class UserRequest(BaseModel):
    username: str
    password: str

# 用户信息基础数据模型
class UserInfoBase(BaseModel):
    nickname: Optional[str] = Field(None, max_length=50, description="昵称")
    avatar: Optional[str] = Field(None, max_length=255, description="头像URL")
    gender: Optional[str] = Field(None, max_length=10, description="性别")
    bio: Optional[str] = Field(None, max_length=500, description="个人简介")


class UserInfoResponse(UserInfoBase):
    id: int
    username: str

    # 模型类配置
    model_config = ConfigDict(
        from_attributes=True  # 允许从 ORM 对象属性中取值
    )


# data 数据类型
class UserAuthResponse(BaseModel):
    token: str
    user_info: UserInfoResponse = Field(..., alias="userInfo")

    # 模型类配置
    model_config = ConfigDict(
        populate_by_name=True,  # alias / 字段名兼容
        from_attributes=True   # 允许从 ORM 对象属性中取值
    )

3. routers/users.py

python 复制代码
## 构建响应数据:token + 用户信息
# model_validate: 将 ORM 模型对象转换为 Pydantic 响应模型
response_data = UserAuthResponse(token=token, userInfo=UserInfoResponse.model_validate(user))
return success_response(data=response_data)

完整代码

python 复制代码
# 用户注册
@router.post("/register")
async def register(user_data: UserRequest, db: AsyncSession = Depends(get_db)):
    # 根据用户名查询数据库
    db_user = await users.get_user_by_username(db, user_data.username)
    if db_user:
        return Result.error("用户已存在", 400)

    # 新增用户
    user = await users.create_user(db, user_data)

    # 生成 Token
    token = await users.create_token(db, user.id)

    # return {
    #     "code": 200,
    #     "message": "注册成功",
    #     "data": {
    #         "token": token,
    #         "userInfo": {
    #             "id": user.id,
    #             "username": user_data.username,
    #             "bio": user.bio,
    #             "avatar": user.avatar
    #         }
    #     }
    # }

    ## 构建响应数据:token + 用户信息
    # model_validate: 将 ORM 模型对象转换为 Pydantic 响应模型
    response_data = UserAuthResponse(token=token, userInfo=UserInfoResponse.model_validate(user))
    return success_response(data=response_data)
相关推荐
卷福同学12 分钟前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
GetcharZp3 小时前
只需 10 分钟,轻松实现异地组网!Netmaker 保姆级部署教程来了
后端
前端兰博3 小时前
03-Spring Boot
后端
前端兰博3 小时前
01-Java开发基础语言
后端
前端兰博3 小时前
02-Servlet、JDBC、Maven、Mybatis
后端
聪明的一休丶4 小时前
VLLM v0.24.0 版本深度解析:新引擎、新架构与大规模服务全家桶升级
python·架构·vllm
咖啡八杯4 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
码事漫谈5 小时前
Loop 正在排斥人为操作
后端
爱勇宝5 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
云和恩墨5 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr