# fastboot **Repository Path**: bean1995/fastboot ## Basic Information - **Project Name**: fastboot - **Description**: Make fastapi as easy to use as spring boot - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-08-28 - **Last Updated**: 2023-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FastBooter > Make fastapi as easy to use as spring boot ![drf-tutorial](./doc/fastboot.png) ## 一、开篇词 作为一个多年开发java web的程序员,初次接触python这种语言是对自身的一种挑战,无论是从语法还是思想上,都有着多多少少的不适应。 可是随着python的兴起,越来越多的人都把python作为自己的第二语言,所以为了给自己充充电,拓宽一下思路,我也走上了自学python的道路。 但是由于自己做java根深蒂固的想法以及网络上的一些python课程讲解的过于基础,所以总想根据自己的编程经验,找到python与java的契合点。 这个契合点我想从web编程开始找起,所以期间了解了django、flask这些框架,对于django,我不想写前端代码以及不想受到那么多的限制,所以直接毙掉。flask我比较喜欢,可是总有多多少少的不舒服,就跟java上一时代的SpringMVC一样,虽然是功能能够满足, 但是总感觉有一些的不优雅,就像你见识了springBoot和springCloud后,就不想再回归springMVC一样。 偶然,我发现了FastApi(性能、方便这些我下面就不说了,网上都有各种数据说他多好多好,我只说使用体验)。 可能因为我接触python比较晚,没有经历过python的各种变革,所以当我看到这个框架的时候,就感觉到了他与SpringBoot的相似之处,而且对他了解的越多, 越能感受到,这就是我一直想要寻找的优秀框架。 奈何当我心心念念的学完他的一系列东西时,想要找到他的完整项目封装,苦苦无果。 所以,我心血来潮,想要封装一个像SpringBoot一样好用的python web框架,借助我对SpringBoot思想的理解以及多年接触java大型项目的经验,为我后续的python学习道路打下一个良好的基础,至少在我眼里, java能做的,我用python同样能做,java不能做的,等待我日后对python更加深刻了解后做好补充,先让我的java能力和python能力保持一个水平线上。 我也将会利用我的业余时间,不断的去完善这个框架,坚持下来,说不定会有一些由java转到python的同行会喜欢。 写于:2021-08-15 ## 二、先说一下Java吧,我认为他好的一方面。 ### 第一: 分包明确 我常用的框架是SpringBoot+Mybatis+MySql,一般对的他分包方式是这么几层 ``` - entitys // 实体类(这里面存放这和表结构一一对应的对象,绝不能多,更不能少) - enums // 枚举类(这里对应这MySql中类型的字段,不允许使用数字,必须使用英文) - dto // 入参类(必须继承实体类,可在里面拓展字段,用户接受额外的字段) - vo // 出参类(必须继承实体类,可在里面拓展字段,用于多表查询返回额外的字段) - controller // 控制层 (这里面存放着接口路由,只做参数校验,不做任何业务逻辑处理) - service // 服务层(这里存放这服务接口,充当目录作用,所有操作必须在他的实现类中处理) - service.impl // 服务实现层(这里存放service的实现,也是一个业务的核心处理类) - dao // 数据持久层(这里存放这与数据库相关的一些sql语句,所有的增删改查都由他来处理) - dao.provider // 动态sql层(一个完整的项目,绝不是一些单sql就能解决的,他还需要到sql的动态拼接,这里就是处理sql动态拼接的) ``` ### 第二:AOP 思想 AOP 是面向切面的编程,他讲我们的一些通用操作和我们的核心业务分隔了出来,准确来说,他让我们写的代码更优雅,只需要专注于核心业务即可。 正常我在java中用到的AOP大体有以下这些 ```javascript - 日志打印 (一个接口的请求日志非常重要,他是我们处理程序问题的第一标尺,谁都会出bug) - 签名验证 (当我们开发移动端应用的时候,我们要为接口加上一层安全防护,通过特定算法让外人无法轻易的访问我们的接口) - 统一异常处理 (这里包含2种异常,一种是已知异常,一种是未知异常(系统错误等),在java中我们都是会直接throw掉,由统一异常处理成我们期望的格式) ``` ### 第三:潜移默化的一些东西 这里面就包含很多了。 ```javascript - mysql 连接池(由于框架为我们封装了一些属性,所以我们在开发的时候几乎不用管mysql的连接问题,都交给了Druid) - 统一返回结构体 (我们与前端的交互,无论正常还是异常,都是返回一个 code msg data 这样的结构体,前端根据返回结果再加载界面) - 事务(虽然事务也是aop思想,但是由于是spring为我们提供的@Transtration注解,所以我们也离不开他) - 参数校验(我们厌倦了一个个值的校验,都是在实体类或DTO中做校验,使用@valid注解) - 原生sql(我最开始是用的jpa这种orm的操作方式,可是随着项目的复杂性,还是发现原生sql香,而且我不喜欢自动生成的一些东西,手艺人就是靠手吃饭的) ``` ## 四、框架封装思路 我将围绕这java的思想,尽最大努力找到SpringBoot在python中的契合点,并形成一套模板,但是有些东西也没法完完全全一直,因此就一个思想:求同存异 ## 五、具体封装详解 + [FASTBOOT标准化使用方法](./doc/md/标准化使用方法.md) + [统一异常封装](./doc/md/统一异常封装.md) + [统一返回格式](./doc/md/统一返回格式.md) + [配置文件](./doc/md/配置文件.md) + [数据库封装](./doc/md/数据库封装.md) + [签名校验](./doc/md/签名校验.md) ## 六、结语 学不可以已,框架封装之路道阻且长