FastAPI项目开发最佳实践

2020-11-12  本文已影响0人  小餐包

最近FastAPI项目特别火,以下是我们项目组在用FastAPI开发时的总结的一些最佳实践以及一些代码规范,分享给大家。

通用规范

  1. 请勿将敏感信息包括但不限于密码信息,客户信息等上传到代码库!
  2. 代码提交前检查一下有没有调试时的print或者log代码没删除干净;
  3. 代码风格:用Pycharm的同学,先Ctrl+Alt+L应用一下PEP8风格,再用Ctrl+Alt+I调整一下Import顺序。 用VS Code的请用插件搞定上述需求;
  4. Commit 信息:有Aone需求或者缺陷的请贴上链接;
  5. PR:push自己的开发分支到远程,如果commit较多(超过3个)建议本地rebase成一个commit以后再push上来,提交评审后根据评审意见逐条确认,全部修改以后再push一个新的commit。
  6. 分支合并策略:默认情况下合并分支采用squash方式,且合并后会删除该分支,如需要保存请提前沟通或者备注。
  7. 提交评审请对照下面的规范👇自检

FastAPI开发规范

  1. router函数需要添加docs,方便用户了解接口用途, 例如:

    @router.get("/{callback_id}/records/last", response_model=CallBackRecordResponse)
    async def get_last_callback_record(callback_id: int, db: Session = Depends(get_db)):
        """查询最后一次回调记录"""
        return crud.get_last_callback_record(db, callback_id)
    
  2. bodyresponse应该声明为pydentic.BaseModel的子类,并且使用Field类声明默认值(如果有),描述信息(必须),举例值(如果必要)等,例如:

    class CallBackBase(BaseModel):
        path: Optional[str] = Field(
            default=None,
            example="",
            description="If not specific, it will generate random path")
        tags: Optional[list] = Field(
            default=None,
            description="tags of the custom callback",
            example=["tag1", "tag2"])
    
  3. 如果router函数不能直接推断出返回值类型的话(比如CRUD的结果),应当在router装饰器的resposne_model参数里声明类型,例如:

    @router.get("/{callback_id}", response_model=CallBackResponse)
    async def get_callback(callback_id: int, db: Session = Depends(get_db)):
        """查询回调URL的定义"""
        schema_callback = crud.get_callback_by_id(db, callback_id)
        if not schema_callback:
            raise HTTPException(status_code=404, detail="Callback does not exists!")
        return schema_callback
    
  4. schemas里的类名应该使用XXXBase, XXXCreate, XXXResponse等形式,避免跟sqlalchemy的models类名冲突,例如:

    # models.callback.py
    class CallBack(Base): 
     ...
     
    
    # schemas.callback.py
    class CallBackBase(BaseModel): # 基类
     ...
     
    class CallBackCreate(CallBackBase): # 创建类
     pass
     
    class CallBackResponse(CallBackBase): #响应类
     ...
    
  5. 原则上所有资源都要添加tags域,方便后续进行资源筛选以及权限控制;

RESTAPI规范

上一篇 下一篇

猜你喜欢

热点阅读