fastapi用户登录模块——“获取用户自己的资料“+“修改个人信息“

@router.get("/info", summary="获取用户自己的资料")
async def getUserInfo(*,
                      db: Session = Depends(deps.get_db),
                      u: Users = Depends(deps.get_current_user) 
                      ):
    roles = [role.name for role in curd_user.getRoles(db, u['id'])]
    return respSuccessJson(data={
        'email': u['email'],
        'phone': u['phone'],
        'username': u['username'],
        'nickname': u['nickname'],
        'avatar': u['avatar'],
        'sex': u['sex'],
        'roles': roles
    })

这段代码是一个使用FastAPI框架编写的Python后端接口。它是一个GET请求,路径为"/info",用于获取用户自己的资料。在这个接口中,使用了依赖注入(Dependency Injection)来获取数据库会话(db)和当前用户(u)。然后从数据库中获取用户的角色信息,并返回用户的邮箱、电话、用户名、昵称、头像、性别和角色信息。最后,使用了一个名为"respSuccessJson"的函数来返回成功的JSON响应,其中包含了获取到的用户信息。
这段代码的作用是在用户请求"/info"路径时,返回当前用户的个人资料信息。

@router.put("/info", summary="修改个人信息")
async def changeUserInfo(*,
                         db: Session = Depends(deps.get_db),
                         token_data=Depends(deps.check_jwt_token),
                         obj: user_info_schemas.ChangeUserInfoSchema
                         ):
    user_id = token_data.sub
    curd_user.update(db, _id=user_id, obj_in=obj, modifier_id=user_id)
    return respSuccessJson()

这段代码是一个使用FastAPI框架编写的Python后端接口。它是一个PUT请求,路径为"/info",用于修改个人信息。在这个接口中,同样使用了依赖注入(Dependency Injection)来获取数据库会话(db)和JWT令牌中的用户数据(token_data),以及接收一个名为"obj"的用户信息修改数据。
在接口的实现中,首先从JWT令牌中获取用户的ID(user_id),然后调用"curd_user.update"函数来更新数据库中对应用户的信息,传入的参数包括数据库会话(db)、用户ID(user_id)、要修改的用户信息数据(obj)以及修改者的ID(modifier_id)。
最后,使用了一个名为"respSuccessJson"的函数来返回一个成功的JSON响应。
这段代码的作用是在用户发送PUT请求到"/info"路径时,根据JWT令牌中的用户信息来修改对应用户的个人信息。

配置
deps

async def get_current_user(db: Session = Depends(get_db), token_data=Depends(check_jwt_token)):
    """
    根据header中token 获取当前用户
    :param db:
    :param token_data:
    :return:
    """
    user = curd_user.get(db, _id=token_data.sub)
    if not user:
        raise exceptions.UserTokenError() 
    return user

这段代码是一个异步函数,用于从数据库中获取当前用户的信息。它接受一个数据库会话(db)和一个JWT令牌数据(token_data)作为参数。
在函数内部,首先调用"curd_user.get"函数从数据库中获取对应用户ID(token_data.sub)的用户信息。如果未找到用户信息,则会引发一个名为"UserTokenError"的自定义异常。
最后,如果成功获取到用户信息,则将其返回。
总的来说,这段代码的作用是根据传入的JWT令牌数据从数据库中获取当前用户的信息,并在未找到用户信息时引发自定义异常。

async def check_jwt_token(redis: Redis = Depends(get_redis), token: Optional[str] = Header(None)) -> Union[str, Any]:
    """
    只解析验证token
    :param redis:
    :param token:
    :return:
    """
    if not token:
        raise exceptions.UserTokenError()
    if redis:
        uid = await redis.get(constants.REDIS_KEY_LOGIN_TOKEN_KEY_PREFIX + token)
        if not uid:
            raise exceptions.UserTokenError()
    try:
        payload = jwt.decode(token, settings.SECRET_KEY, algorithms=settings.JWT_ALGORITHM)
        return token_schemas.TokenPayload(**payload)
    except (jwt.JWTError, jwt.ExpiredSignatureError, ValidationError) as e:
        raise exceptions.UserTokenError() from e

这段代码是一个异步函数,用于验证JWT令牌的有效性。它接受一个Redis实例(redis)和一个可选的字符串类型的token作为参数。

在函数内部,首先会检查传入的token是否存在,如果不存在则会引发一个名为"UserTokenError"的自定义异常。接着,如果存在Redis实例,则会使用该实例从Redis中获取与token相关联的用户ID(uid)。如果未找到用户ID,则同样会引发"UserTokenError"异常。

然后,函数尝试解码传入的token,使用了JWT库中的decode函数,如果解码成功,则会返回token的有效负载(payload),并将其转换为TokenPayload对象。如果解码过程中出现了JWTError、ExpiredSignatureError或ValidationError异常,则同样会引发"UserTokenError"异常。

总的来说,这段代码的作用是验证传入的JWT令牌的有效性,包括检查token是否存在、从Redis中获取用户ID以及解码token,最终返回token的有效负载或引发相应的异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值