FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发

源码见:"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)

测试:

这样我们就完成了用户信息的获取接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值