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)