大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个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_model
,rensonse
和request
的schema
都放在一起不太合理,每个路由函数下,都需要写try...except...
太臃肿了,CURD没有好好封装,越到后面,CURD这一块会比较难看...最最最重要的一点是,重构又可以学到新的知识...
重新调整后,代码结构如下
commons:存放各个公共方法的集合
- expentions:异常处理公共方法
- response:返回公共方法
- request:请求公共方法
- settings:APP相关的设置,存放某些keys
- utils:杂七杂八的公共方法
- constants:APP的一些常量以及枚举值
- core:平台的核心方法
- curd:与数据库交互,增删改查
- middleware:中间件
- models:表模型
- logic:路由函数相关的逻辑
- routers:APP路由
logic
和routers
按照模块进行分层设计
权限认证中间件
还记得我们之前的权限认证直接用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…
- 项目地址