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)
相关推荐
SkyWalking中文站1 分钟前
LLM 回答得好不好?SkyWalking 用 LLM-as-Judge 评估线上回答
后端·aigc
高频因子挖掘机1 小时前
跨市场回测为什么会出现隐蔽的数据错误?从标的映射到历史一致性
后端·github·api
破茧蝴蝶8 小时前
Python分布式爬虫完整教程
开发语言·python
benchmark_cc8 小时前
量化系统架构设计:为什么应该将数据获取与策略逻辑解耦?
python·数据分析·pandas·量化交易·股票数据·quantdash
数据库小学妹9 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库
凤山老林9 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
小白快快跑哦9 小时前
python-字符串全解(六):正则表达式-逻辑运算或
python·正则表达式·字符串·逻辑运算
Thinker QAQ9 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
IvorySQL9 小时前
PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(10 月 15 日)
数据库·postgresql·区块链