@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的有效负载或引发相应的异常。