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)
相关推荐
IT策士19 小时前
Django 从 0 到 1 打造完整电商平台:购物车页面增删改查商品数量
后端·python·django
猎嘤一号19 小时前
Python 打包成 EXE 完整教程(单文件 \+ 整个工程)
数据库·python·microsoft
qq_2949405519 小时前
Python环境搭建
开发语言·python
数据库小学妹19 小时前
分布式数据库架构演进:从集中式到分布式,三大路线一次讲清楚
数据库·分布式·数据库架构
暴躁小师兄数据学院19 小时前
【AI大模型应用开发工程师特训】第01讲—AI在企业中的定位
大数据·python·ai·语言模型
Rauser Mack19 小时前
编程零基础五分钟用AI做了个贪吃蛇(附prompt)
人工智能·python·html·prompt·ai编程
洛水水19 小时前
redis缓存:雪崩、穿透、击穿详解
数据库·redis·缓存
我是一颗柠檬19 小时前
【JDK8新特性】接口默认方法与静态方法Day8
java·开发语言·后端·intellij-idea
lulu121654407819 小时前
【开发者指南】Gemini 3.5开发入门:从API调用到Agent构建
java·开发语言·人工智能·python·ai编程