Skip to content

依赖

依赖项会在运行时由系统自动调用,比如在处理请求前获取数据库session,根据token获取当前用户

示例

/这个接口在执行前会自动调用get_current_user获取当前用户并返回,路由函数只需要指定Depends(get_current_user) 就行了,它能保证返回正确的数据,否则返回HTTPException

py
async def get_current_user(token: str = Depends(oauth2_scheme)) -> UserAllFields:
    """
    根据token获取当前登录用户,用在依赖函数
    :param token:
    :return:
    """
    exception401 = HTTPException(
        status_code=401,
        detail="token失效",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
        key: str = payload.get('sub')
        if not key:
            raise exception401
    except JWTError:
        raise exception401

    return get_user_by_key(key=key)
    
@app.get('/')
async def index(user: User = Depends(get_current_user)): ...

验证返回数据

因为在使用依赖时不能保证依赖项返回的格式,所以建议在每个依赖返回前都用pydantic格式化一下数据。

py
class UserInfo(BaseModel):
    id: int
    name: str
    
def get_user_info(token: str):
    # 从数据库获取用户数据,用pydantic过滤只保留id和name
    user = db.get(kye)
    return UserInfo(**user)

这样在用这个依赖的时候就能保证数据的格式了,不过要注意这里返回的是pydantic模型,如果需要dict可以用.dict()返回