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

大家好~我是小方,欢迎大家关注笋货测试笔记 体完记得俾个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...

相关推荐
Cenxi16 分钟前
f-string 完全手册:60 题从入门到实战
python
2601_9622998820 分钟前
Python编写Linux命令指南
linux·python·开发·命令·指南
此冬歌咏23 分钟前
自动化服务器运维监控系统(python+shell)
linux·运维·服务器·开发语言·python·自动化
zhanghaha131425 分钟前
Python进阶教程:23_Scrapy 爬虫框架 零基础超详细教程
python·信息可视化
爱读源码的大都督41 分钟前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
“AI国潮设计-小江”1 小时前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
k4m7v2pz1 小时前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust
tryCbest1 小时前
FastAPI中passlib包的作用
python·fastapi·passlib
心中有你02141 小时前
Python Tkinter 情侣恋爱日记桌面小程序(本地文件存储,无数据库)
开发语言·python
PFFstronger1 小时前
从 0 到 1 搭建接口自动化测试框架:分层架构 + 数据驱动 + 接口依赖编排
python·架构·自动化