源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统"
在之前的文章:FastAPI(六十七)实战开发《在线课程学习系统》接口开发--用户登陆接口开发,今天实战:用户 个人信息接口开发。
因为我们不一样的用户个人信息不一样,而且需要依赖登录,那么我们需要根据用户是否登录来返回用户信息,根据用户的角色来返回对应的信息。
def get_role_name(db: Session, id: id):
return db.query(Role).filter(Role.id == id).first()
校验下登录,因为我们的token在生成的时候,我们存储了用户信息,那么我们现在看下如何根据token获取用户的信息。
在user_method.py中增加新方法
async def get_current_user(request: Request, token: str = Header(...), db: Session = Depends(create_db)) -> UsernameRole:
"""校验用户是否登录并获取用户信息"""
logger.info("获取个人信息开始了")
credentials_exc = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="验证失败"
)
credentials_expired_exc = HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="用户未登录或者登录token已经失效"
)
try:
payload = jwt.decode(token, TOKEN_CONFIG["secret_key"], algorithms=[TOKEN_CONFIG["algorithm"]])
username: str = payload.get("sub")
if username is None:
raise credentials_exc
redis_token = await request.app.state.redis.get(username)
if not redis_token or redis_token != token:
raise credentials_expired_exc
user_role = get_role_name(db, get_by_username(db, username).role).name
return UsernameRole(username=username, role=user_role)
except JWTError:
logger.warning(f"method get_current_user error: {format_exc()}")
raise credentials_exc
该方法是在用户登录的情况下获取了用户的角色信息和用户名
其中UsernameRole是继承UserBase的pydantic对象,在user_schemas.py中
class UsernameRole(UserBase):
role: str
这样判断了用户是否登录,并且在登录的情况下返回了用户名和角色信息,接下来我们可以完成对应的获取信息接口,在user.py中增加
@user_router.get("/info", summary="获取个人信息", response_model=UserBase)
async def get_user_info(user: UsernameRole = Depends(get_current_user), db: Session = Depends(create_db)):
_user = get_by_username(db, user.username)
data = {
"username": _user.username,
"sex": _user.sex,
"age": _user.age
}
if user.role == "学生":
data["student_num"] = _user.student_num
else:
data["job_Num"] = _user.job_num
logger.info(f"用户:{_user.username} 获取用户信息成功")
return response(data=data)
测试:
这样我们就完成了用户信息的获取接口