数据工厂系列(20)项目管理模块-代码优化&重构代码

497 阅读5分钟

大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个like

回顾

在上篇中,我们已经完成了项目管理模块所有的前端页面开发,但是某些页面需要用到接口暂未开发好,譬如搜索用户、项目详情接口等...今天我们继续来开发新接口和优化代码、以及修复bug,还有重头戏==>重构代码

新接口开发 & 修复

  • 搜索用户接口

这个接口在平台比较通用,新增项目、编辑项目和设置项目成员权限等地方都有用到...首先入参的话,直接一个keyword

这里我们支持用户名、用户姓名和邮箱号进行模糊搜索

返回的话,直接用之前的userDto,对了,这里的response_model有个小改动,ResponseDto采用了泛型设计,所谓的泛型,就是将数据类型作为参数进行传递,在我们用的时候才确定数据类型

那这样子有什么好处的呢?当然就是减少代码量,不用每次都新定义一个新的response_model,这样代码比较臃肿。我们直接看看登录接口就知道了~以前response_model需要新定义一个LoginResDto,但是现在我直接用ResponseDto[UserTokenDto]就可以代表LoginResDto 有关泛型的小知识,大家后续可在网上学习更多...

  • 项目详情接口

这里没啥好讲的,直接通过主键id查出项目信息 唯一要注意的点是,如果拉取方式是ssh形式,需要把公钥返回,其他情况默认返回空

  • 表结构修复

项目表中的项目负责人,以前设计是只存user_id的,但是开发前端页面的时候,发现负责人其实是需要展示用户账号才对,但是又不想连表查询,所以这里的项目负责人直接干脆点,直接存用户账号username,之前的git_type也要改一下,不然接收不到,默认为0

重构项目结构

为什么要重构代码呢?最近看到一个比较优秀的开源fastapi项目,里面设计挺不错的,借鉴~~(copy)~~里面的设计思想...目前目录结构比较乱,第一次用pydantic作为response_modelrensonserequestschema都放在一起不太合理,每个路由函数下,都需要写try...except...太臃肿了,CURD没有好好封装,越到后面,CURD这一块会比较难看...最最最重要的一点是,重构又可以学到新的知识...

重新调整后,代码结构如下

commons:存放各个公共方法的集合

  • expentions:异常处理公共方法
  • response:返回公共方法
  • request:请求公共方法
  • settings:APP相关的设置,存放某些keys
  • utils:杂七杂八的公共方法

  • constants:APP的一些常量以及枚举值
  • core:平台的核心方法
  • curd:与数据库交互,增删改查
  • middleware:中间件
  • models:表模型
  • logic:路由函数相关的逻辑
  • routers:APP路由 logicrouters按照模块进行分层设计

权限认证中间件

还记得我们之前的权限认证直接用Depends来做的,但是每次新写一个api都得带上Depends比较麻烦,把它放在router那边又不太合理,所以这次直接弄个权限认证中间件,比较安逸...

开始之前我们先看一张图,中间件的概念 中间件本质上就是一个函数,它在每个请求被特定的路径操作处理前,以及每个响应返回之前工作,所以:

  • Request Middleware接收你应用程序的每一个请求
  • 然后它可以对这个请求做一些操作,完成一些功能,比如权限认证、防止爬虫校验等...
  • 处理完成后,Request Middleware将请求转发给Application
  • Response Middleware接收到Application的响应
  • 然后可以对响应做一些操作,完成一些功能,譬如生成requests_id,设置response headers等...
  • 处理完成后,Response Middleware将响应进行返回给客户端

创建一个中间件基类,直接在中间件基类扩展功能,这个基类的设计有点类似于BaseHTTPMiddleware,刚才都有说了中间件其实就是函数,核心就是__call__方法

AuthMiddleware直接继承BaseMiddleware,然后重写before_request方法

先判断api是否在白名单内,白名单无需权限认证,接着进行authentication,从请求中获取token,然后解析token,解析失败的错误抛出,接着判断权限,是否是权限范围可访问的api,最后保存解析后的用户数据到请求中,然后从上下文取用户数据,上下文这个知识点我们下期来具体讲讲...

最后我们要注册一下AuthMiddleware中间件,注意一下顺序

第一次用中间件做权限认证还是踩到坑的,但是后面将坑填了...总结踩坑点如下:

在权限认证中间件中直接raise AuthException,会有两个问题:

  • 出现了跨域,原因:实际上启动时,ServerErrorMiddleware中间件是会默认加载,导致ServerErrorMiddleware直接抛出异常,直接跳过了CORSMiddleware中间件,所以就出现跨域,解决方法:处理异常时返回的Response中的headers加上跨域相关的配置

  • 控制台出现错误栈信息,原因:权限认证中间件中直接raise AuthException,导致ServerErrorMiddleware也会直接raise exc,解决方法:新增中间件,通过继承BaseHTTPMiddleware,重写dispatch方法,将报错统一return到全局的异常处理

结论:第二个问题解决的同时,跨域的问题也就解决了...中间件类似这样的套娃 ==> C(B(A())) A是AuthMiddleware,中间件抛出异常,C是ServerErrorMiddleware捕获到错误,直接raise err,B是CORSMiddleware,直接跳过了,所以得在A之后加上ExceptionMiddleware处理中间件抛出的异常,最后就是D(C(B(A()))),A:AuthMiddleware,B:ExceptionMiddleware,C:CORSMiddleware,D:ServerErrorMiddleware

总结

今天主要是进行了代码的重构,还有小部分的接口开发和修复,代码我先不提交,待我调整完后一次性上传...对了,分享一个优秀的fastapi开源项目:github.com/HuiDBK/HuiH…