那么上节课呢,我们已经创建好了项目的目录结构,那么接下来呢,我们就将之前的代码呢划分到这不同的文件里边来。 好,那么首先的话呢,我们可以打开咱们之前创建的这个文件啊,那在这里边的话呢,我们可以先去把简单的先给他去挪一下, 那这个简单呢,比如说啊,像这个从上到下我们去看吧啊,首先这个配置文件啊,这块是比较简单的啊,因为它无非就是一个变量嘛,对不对?所以说的话呢,我们可以直接把它给它挪走,把它挪走了以后的话呢,然后我们给它放到哪呢?放到这个 config 里边来, ok 吧?那放到这个 configure 来以后的话呢?注意啊,有的一些模块啊,该怎么去引入的?还给人家引进来,那在这呢,我们就 from, 然后里边 typing, 把这个 d i c t 给它引过来, ok 吧?好,那么这样的话呢,我们这个配置文件就算是搞定了,然后再起的就是这边有一个叫做 model, 这个 model 的 话呢,这个也是比较简单的啊,我们直接把咱这个 model 模型给它创建过来啊,就是给它拿过来这个东西。好,那么它拿过来以后的话呢,在这边我们同样啊要去引入对应的这个模块。 from, 然后这边引进来,然后 skimmers 这边我们也可以给它挪过来, 那在这的话呢,我们给它把包引进来。好,那么目前来说的话呢,这几个东西就算是改好了啊, skimmer, 哎,还有这个 model config 就算是改好了,那么它改好了以后的话呢,然后我们再看一下这边的话呢,还有就是这个啊, root, root 这块的话呢,也是比较容易改的,那么我们直接将对应的东西给它复制过来就可以了啊,那么我们找到这个 item item 的 话呢,它对应的是这个代码,对吧?我们直接给它复制过来, 好,那么它复制过来以后呢,在这我们需要去注意的就什么呢?就是它这用的是一个 item root, 对 不对?好,那么既然是 item root 的 话,那么我们肯定是在当前文件里边要有,对不对?那么因此的话呢,我们在这 from fast api 引进来,然后我们再创建一个 item root 就 可以了, ok 吧?好,那么同理啊,那么我们这个 user 这块也是一样的,把这个 user 给它打开,然后把这个 user 代码给它拿过来, 好,那么它拿过来了以后,那么接下来我们 from fast api, 然后给它引过这个 root 来,然后再其次就是我们这给它创建这个 user root, ok, 好, 那么这个代码的话呢,一定要跟人这边咱们这边写的是一样的啊,也说白了,咱们把这个东西给它拿过来啊,这个东西咱们之前这没加前缀,是吧?应该给它加上啊, 咱这个 item 也给它加上吧, item 这儿是这块是吧?那就是前缀啊,还有它这个名称都给它加上, 好吧?好,那么目前来说,咱们现在这个路由这块儿,哎,基本上复制过来了,复制过来以后呢,关于这个 user 这块儿的话呢,你会发现它这儿还有这个报错,这个报错也不能说是报错吧,是警告它说我们没有去定义这个东西,是因为我们没有引入,那么我们在这儿的话呢? from, 从咱们当前的这个, 呃,应该是这个 scamer, 对 吧? scamer 的 话呢,那我们就从 scamer 里边儿引过来咱们这个 user 来, 那么这样的话呢,咱们这边就没有问题了, ok 吧?好,那么这两个模型啊,不能说两个模型,两个路由啊,搞定了,两个路由搞定了以后呢话呢,那么接下来我们要去复制啊,那谁呢? init 这块, 这个 init 是 干什么用呢?就是当我们要去启动这些路由地址的时候,那么我们是不是要从这边引入,对不对?那么引入的时候呢,我们就可以在这个 init 里边,然后进行相应的一个域加载,这个域加载是怎么去做呢?我们这么去写,叫做 from fast api, 然后 input a p router, 好, 有了它以后的话呢,我们在咱们这边来,你看啊,咱们之前创建了有一个 v e 这个 router, 对 不对?先给它拿过来创建出来,好,那么它创建出来以后,那么 v e router 是 不是要去 include 的 包含咱们这些东西?就是包含咱们之前创建过的那个路由,对吧?好,那么也就说它这要包含路由,那么路由的话呢,一个是 user router, 还有一个就是 item router, 但是目前来说的话呢,这个文件里边是没有的,所以说我们要去引过来,从咱们当前这个目录下,就是当前 user 里边 import user root, 然后当前 item 里边引入这个 item, ok 吧?好,那么目前来说,咱们这的话呢,也就算是改好了啊,相当于是我们这个代码, 这段代码也给他挪走了,然后下面这段代码呢,也给他挪走了,那么下段这段码呢?这段代码呢?注意咱们这个 app 并没有引啊,没有去挪,好吧,好,那么这搞定了以后,那么接下来的话呢,我们再来什么呢?看一下该改谁啊?首先 root 这边文件都有了, 然后 configure 这边也都有了,然后呢这个 model 和 scammer 都有了,然后我们就差谁了?差这个 database, midware 和这个 man 文件了,对不对?好,那么这个 man 文件我们先去,嗯,先改这个 database 吧,先改 database 吧,好,那么这个 database 的 话,这个东西应该怎么去写呢? 首先来说啊,我们在这儿理论上来说的话呢,我们直接把咱们这段代码给它拿过来就可以了, 把这个单元格直接给它扔过来就可以了。但是当我们把它扔过来以后呢,首先我们要改的事情就是先要去把对应的这个函数给它引进来,对不对?然后再其的就是我们会发现啊,在这里边有一个 app 这个参数,而这个 app 参数的话呢,我们目前来说实际上是没有的, 对不对?我们需要从这个问文件里边给它引入过来啊,因为咱们再去启动项目的时候,我们是这么去写的, from fast api, 然后在这 app 等于这个东西我们要是从这去启动啊,对不对?我们从这去启动的话,那么我们要去从这个文件里边去引进来,但时间来说的话呢,如果说这么去引入的话,就有可能啊,会出现循环导入的一个问题啊,循环导入的问题, 那这个循环导入是指的什么意思啊?就比如说 a 说了说我要导入 b, 而 b 文件里面呢?说,哎,我还要去导入 a, 也就是他们互相去导,那么这时候的话呢,就会出现问题,所以说面对这样一个情况的话,我们这这个 database 的 话呢,哎,我们考虑啊,不要去直接去用啊,不要去说什么我要去导这个东西,那我这么去写,我呢在这的话呢,定一个方法叫做抵犯的,叫做 register, 就是 注册,或者说我们注册数据库吧, 注册数据库,好,那么注册数据库的话呢,在这里边啊,给它调用我们当前这个方法,然后它这个方法的话呢,它可以传递 app 过来, ok 吧?所以说我们这就这么去写,写一个叫做 app, 然后呢?哎, fast api, 好, 这个对象,那这个对象的话呢?我们就 from, 然后给它拿过来, 然后再其次就是它不是还有 configure 吗?好,那么 configure 的 话呢,就是我们当前的就是一个 d i c t 的 一个格式, d i t c 的 格式,然后后边的话呢,还有其他的参数,那么我们都可以给它进行这样的一个编写,比如说默认情况来说的话,就是处, ok 吧?好,再其次就是这个值, 那么他的话呢,默认也是出。好,那么这搞定了以后呢,你看啊,现在相当于什么呀?相当于是我们目前这个方法的话呢,我们就不用再去往里边去传递参数了啊,那么我们直接去调用的时候,谁调用他,谁往这去传,他一传过来以后,那么底下这个底边是不是就可以赋值了? 因此的话呢,我们直接就将上面这个值呢给他复制过来就可以了, ok 吧?好,那么这是这块成,那么这搞定了以后,这还有一些细节啊,就比如说默认是这个是处,然后还有什么他的类型啊,都给他写上。 那么对于后边这两个参数的话呢,我们可以什么呀?可以传,也可以不传,这就根据我们的具体一个情况了,好吧,好,那么这样的话呢,我们这个 database 也算是改好了。好,那么他改好了以后的话呢?那么我们在这个 main 文件里边,这边应该怎么去写呢?来看一下啊, 首先我们创建了应用,对不对?创建应用以后的话呢,然后我们就可以什么呀?在上面给它,哎,这么写。 from, 从我们当前 app 里边, app 里边有一个 root, root 里边引 import 导入谁啊?导入 v e root 我 们第一个版本啊,我就是,我们这不是用 v e 来去管理的 user 和 item 吗?对不对?所以说我们现在的话呢,直接在咱们这个 main 文件里边啊,我先把这个 v e 引进来, 他引进来以后,咱们这个 user 和这个 item 是 不是也就引进来啦?因为在这里边已经包含了,对吧?所以说往那这就写一个 app 点 include, 导入咱们对应的路由, ok 吧?这就相对是导入啊,注册路由,对,注册路由没问题吧? 好,那么他注册完路由以后,那么接下来我们要什么呀?我们要去注册数据库,对吧?那么注册数据库的话比较简单,我们从哪啊? from, 导入谁啊? app 里边 database 有 一个专门注册数据库的,这个方法,对不对?好,那么注册数据库方法,我们在这写一个它,然后呢把我们当前这个 app 给它传递过去就可以了。 然后至于咱们这个数据库它到底连接谁?那么目前咱们当前这个启动页面,他也不知道为什么,因为我们专门有管理配置文件的东西,对吧?那因此的话,我要在什么呀? um um 什么呀? app 点什么呀? in configure, 然后 import 导入我们这个具体的这个值,对吧?那么我们在 item 里边,我们这是不是已经创建好了, 所以说的话呢?哎,我们就直接给他引过来,把他传递过去就可以了。好,那么他传递过去以后,至于其他的两个参数,哎,像什么这个生成这个模板啊,还有这个异常管理啊,那么我们要不要去做啊?生成模板,你比如说我们已经创建好了,我们就没有必要去写了,对不对?那我在这的话呢,就给他写上一个 false 嘛, 对不对?好,那么后边那个管理这个这个异常的话呢?哎,我们让他去管就可以了,对吧?好,那么这就是这块啊,成,那么管理好这个数据库以后,那么接下来的话呢,我们就可以启动咱们这个服务了啊,启动服务好,那么启动服务的话呢,这个东西跟我们之前写的这个文件是基本上是一样的,我们在这给它复制过来, 找到咱们这个闷。好,那么这时候的话呢,我们就不再去写二十九了,因为我们当前这个文件的话呢,就是闷点 p y 文件,对吧? 好,那么现在的话呢,我们再来看一下这个效果啊,现在咱们这个目录代码呢,基本上已经拆的差太多了啊,基本上主要功能已经拆,已经都拆出来了。好,那么接下来我们给他启动看效果,那注意的就是我把终端已经全部关掉了啊,全都关掉了,然后我们再去启动,启动的是当前项目啊, 好,那么启动当前项目的时候,然后在这告诉我们说什么呀?说 no model name scammers, 没有这个东西,那也就说第二行,第二行的话是谁啊?我们要关注的是这里边有一个 app router, 然后 users 啊,在这个 users 里边给我们报的错, 这儿他说在这里边没有 scammers, 那 没有这个东西,没有 scam, 有 它,对吧?我们给它拿过来, 在当前目录下啊,在这里边实际上是没有的,在这里边啊,明白了,它要从 app 的 这个目录开始找 啊,无非就是导入的方式不对啊。好,那么接下来我们再来看一下啊,再去运行。 好,那么这时候运行以后,然后我们可以看到说 model 二十九没有被找到啊,很正常关掉啊,为什么?因为我们这是复制过来代码啊,咱这没有去改,对不对?那这的话呢?我们是不是要去改,原来咱们是在什么呀?在这个 man 二十九当前这一个文件里边, 对不对?现在我们换了吧,现在换到哪了呢?现在换到了这个 app 下的 models 这个文件里边,对不对?所以说我这儿要去改叫做 app, 然后里边的 models 里边,对不对?好,那么这儿改过来以后来接下来我们再来去启动。 好,那么这时候启动我们发现没有问题了,对吧?没有问题了以后,接下来我们去访问咱们这个接口啊,让我们在这给它刷新一下,刷新以后,然后我们会发现这边都是没有问题的,那么我们先说商品应用,然后给它获取 啊,获取信息 s q 的, 然后我们可以看到成功的获取到了商品信息,对吧?然后接下来我们在这边获取,这个就是创建用户吧,之前的话呢,我们创建了一个吕布,现在的话呢,我们画一个貂蝉啊,貂蝉啊,貂蝉,然后就是貂蝉 at qq 点 com, 然后他的话呢?嗯,十八,好吧。好,那么我们在去执行之前呢,我们可以关注下数据库啊,找到咱们这个数据库,然后看这个 user, user 里边只有里部一条信息,对不对?那么我们给他点过来看下这个数据啊, 然后在这边 s q 的, s q 的 以后,然后我们可以看到这儿这个数据的话呢,它告诉我们已经创建成功了,创建成功了以后呢,然后我们回到数据库看一下运行,那么我们可以看到这个貂蝉就有了,对吧?好,那么这儿有了以后,那么我们接下来给它获取呀,获取一下,给它粘, 就是 inform 嘛,对不对?然后拆 it sq 的, 那么当我们在调用 xq 的 时候,然后这获取的是吕布啊,因为它是第一条数据,好吧?好,那么现在的话呢,我们会发现这个接口基本上都是可以用的, ok 吧? 好,那么也就说现在的话呢,我们基本上已经拆的差不太多了,那么还有一个东西就是我们现在没有拆,没有拆是谁啊?是中间键,目前我们中间这里边是空的,对吧?那么我们现在这个中间是写在哪呢?写到了这块 啊,我们直接给他复制出来,就给他复制过来,可以了啊,复制过来,那么为什么说这个东西,我最后去说啊?是因为这个东西,我们你想想,你看一下这个代码, 他在去写这个中间键的时候,他这的话呢,用了一个 app 的 一个这么一个装饰器,对吧?那么用这个 app 这个装饰器的话呢,如果说按照这样一个速度来说的话,首先我们要去引入这个 app, 对 不对?但实际上来说的话呢,我们在这是没有的, 没有的,对不对?好,那为了这样一个情况怎么办嘞?好,那么我们就可以这么去写,我在这的话呢,给他包装一下,写一个叫做抵犯的 request middleware, 就是 专门用来 做这个请求这个中间件的, ok 吧?好,那么在这里边呢,我要求他给我传递过来一个 app 对 象, 好,那么他这样传递过来以后,那么我们这是不是就有了?所以说这时候我们再去调用这个方法是不是就可以了? 但是在这一定要注意这个属于什么呀?方法里边包含的方法对不对?方法里边包含方法了以后,那么他就什么呀?就会不会被调用,对不对?那么在这的话呢,我们这么去写,我就给他在咱们这个方法里边 return, 返回我们当前这个应用 就可以了,好吧,好,那么这搞定了以后啊,那么现在咱们这个中间键这块就算是写好了啊,也就是复制过来了。三是原来的代码机,原来代码直接复制过来,然后在这呢给它包装了这么一行, 包装了一个函数, ok 吧?好,那么包装完这个函数以后,然后我们怎么去用呢?这个东西也比较简单,我们直接啊找到咱们这个主应用,因为它是负责协调所有的东西的一个使用吗?对不对?所以说的话,我们在这就给他写上一个叫做这个注册,注册 啊,注册,注册中间键, 那么注册中心怎么注注册呢? app 等于,然后我们这写一个叫做 request, 哎,咱这 request 没引进来啊,在这的话呢,就是 from app middleware, 然后导入 request middleware, ok 吧?有它以后,然后我在这去调用一下,调用的时候呢,我把咱们这个当前 app 给它传过去, ok 吧?好,那么他传过去了以后,那么在那边就有了,对吧?有了以后他就能调用了, ok 吧?好,那么这搞定以后来我们再来看一下啊,我们当前应用是启动的啊,启动的,并且的是啊 re load 的 自动重启, 所以说的话呢,我们就可以直接访问,那么访问的时候呢,我们要关注咱们这个后台到底有没有去调用咱这个中间键, ok 吧?好,那么我们再来看一下,在这的话呢,我们给他就啊,就,就就这个吧, s q 的, s q 的 完了以后,然后回到控台,回到控台以后,然后我们可以看到请求前和请求后,对吧?说明我们的中间键呢?哎,也启动了,好,那么这聊完了以后呢,关于咱们这个项目结构啊,怎么去划分,基本上也就说的差不太多了啊,那么 聊到这了以后呢,你看啊,现在项目结构这搞定了,那么后期扩展也知道怎么去扩展了,还有基本路由怎么去编辑,也就差不太多了,对吧? 那么关于咱们这个 fast api 呢,也基本上也就差不太多了,当然除这以外的话呢,还可能会有一些其他的一些特殊需求,特殊功能,那这个东西呢,咱们在这个基础上进行扩展,我相信各位小伙伴呢,基本上也是没什么太大问题。好吧,好,那么这是这个东西,那关于 fast api 的 话呢,我们就暂时先聊到这儿。
粉丝723获赞765

fast api 是一种现代高性能的 python web 框架,用于构建 web 应用程序和 api。 它基于 python 的异步编程库、 access you 和 wait 语法,以及类型注解和自动文档生成等特性, 提供了快速、易用和可靠的开发体验。接下来的视频将向您介绍十个被忽视的 face api 实用功能,让您更好地利用这个强大的框架 代码参见拍放学院大本营公众号,还有更多技术内容分享。一、依赖注入 skpi 知识定义依赖项, 这些依赖项会被解析并注入到路径操作中。您可以使用这个功能来处理常见任务,如数据库连接或用户身份验证。二、响应模型通过使 使用 pidantic 模型声明响应结构,您可以自动生成 api 文档并验证响应数据。三、 http 异常通过抛出带有状态代码和详细信息的 http 异常, 您可以处理不同的 http 状态代码,提供更好的错误处理和用户体验。四、路径参数和转换器 使用转换器将路径参数转换为所需的拍放数据类型,使得处理和验证输入数据更加灵活和方便。五、后台任务将需要长时间运行的任务委托给后台处理,以释放 api 的响应时间,提高系统的并发性和性能。 六、查询参数和字符串验证使用酷瑞声明字符串查询参数并进行验证,确保输入 数据的有效性和安全性。七、带密码和散裂的 os 二和使用 drew 令牌的 bearer fast api 内置了 osr 密码和 bearer, 用于处理用户注册、登录和令牌检索的所有路径,使得身份验证和授权变得更加简单和安全。 八、使用 pytentic 进行数据验证和序列化 fast api 使用 pytentic 进行数据验证和序列化,提供了一种简单的方式来处理错误和复杂数据类型,确保数据的准确性和一致性。 九、使用 starlet 的 test client 进行测试 test api 支持使用 starlet 的 test client 编写,简洁的测试,用力帮助您确保应用程序的正确性和稳定性。十、自动交互式 api 文档 fast api 通过集成 swagger、 ui 和 radar, 提供了自动生成的交互式 api 文档。 您只需访问 dogs 或 redog 路由,即可方便的查看和测试 api 的功能和用法。通过掌握这些被忽视的 fast api 实用功能,您将能够更高效地开发外部应用程序和 api, 提高开发效率和代码质量,为用户提供更好的体验。快来体验 ss kpi 吧! 推荐书单利用 fast api 构建拍放微服务利用 fast api 构建拍放微服务详细阐述了与分布式机器学习相关的基本解决方案,主要包括,设置 fast api 探索核心功能。依赖注入研究构建微服务应用程序,连接到关系数据库, 使用非关系数据库保护 rest api 的安全。创建携程事件和消息驱动的事物。利用其他高级功能解决数值符号和图形问题。添加其他微服务功能等内容。 此外,本书还提供了相应的势力代码,以帮助读者进一步理解相关方案的实现过程。


兄弟们,这个,兄弟们,这个 fast api 是真牛,真牛逼啊。这个开发出来把这个后面加个 docs, 自带文档,自带文档这个后端的一个就别卷扎袜了,别卷扎袜了,赶紧学这个。

fast api 后端开发框架特点介绍 好,今天我们讲一下 fast api 后端开发框架的一些相关内容。整个框架呢,它是基于 python 的 一种呃后端的一个应用框架,它在前端肯定是可以结合各种 呃各样的前端,包括我们可能用到的 b s 端、 h 五端,小程序端,或者说 inform, 我 们或者叫我们叫桌面端,这种呢,它是都可以实现这种接口的对接的,相当于一个后端的一个数据中心啊,可以对接多个前端的一个 一个模式。呃,我们这里面讲这个框架呢,它的技术栈起主要是基于拍审发视 api, 还有斯克 alchemy, 还有帕达特 reddis, 蒙古 d b 的 一个后端的一个整合。 这个技术栈可能有些人没接触过拍审开发,或者对拍审开发还不太了解的话,可能存在一些问题啊,就是不太了解这些名词代表是具体什么意思。 那我们在后面介介绍的话,我们会逐一讲讲一下这些概念性的东西,让我们整体有个了解 这个视频呢,我们主要是要讲一下整个发售 a p i 的 一些初步的一个知识,就是整个框架大概怎么一个初步的一个了解,以及各个技术的一个方向,还有整个项目的一个层次啊,以及一些准备工作,包括环境呢,还有一些插件呢,或者说我们 啊,部署啊,测试啊,这些就是我们整体有一个大概的了解,这个是我们开发一套整体的应用所需要的一个过程, 就是我们首先我们了解整个技术的东西呢,我们首先要对各个方面要做一个比较全面的了解,然后再深入每个具具体的一个功能细节啊,或者开发步骤上面去逐逐一的去攻破各个的技术的一个难关。 首先我们这个章节呢的提纲大概讲一下,就是包括有这几个部分的内容,呃,主要是有呃 f s a p i 的 一些相关介绍啊,以及 f s a p i。 后端的我们整套项目的框架的一个特点,它具具有哪些亮点的东西,我们要讲一讲, 然后后面我们会讲的要运行啊,或者是部署啊,开发啊,这些整套框架需要安装哪些开发环境 啊,然后再怎么样去运行它,然后呢我们大概对整个后端的框架有个了解,这样子我们才能够入手我们整个项目的一个具体开发工作。 然后呢项目运行起来呢,我们可能会做一些相关数据库的或者是参数的配置,那我们这个配置应该怎么修改也要着手了解一下。 还有对于整个项目我们要知道各个目录它是代表不同的意思,有个约定俗成在里面,那我们对整个项目的框架的结构有个了解,这样子我们每次会定位信息啊,找 相关的功能点的时候就很容易找得到啊。还有对后端开发框架的 api, 我 们要怎么去做测试呢?或者做做一些了解呢? 这个也是非常关键的,因为我们做后端对接的时候,跟后端对接的时候肯定是需要对这个接口进行一个了解的,否则那里就很难进行一个 呃实际功能的一个测试了。然后还有就是前方项目是怎么的整合这个接口的呢?他是需要准备一些什么条件呢?还有包括我们的令牌啊,或者什么头部信息啊,以及呃返回的结果进行一个处理,或者说总总体上的一个解析。 那我们就要做这相关的一些介绍,还有整个后端的项目我们如何打包啊?然后这如何在 具体部署到项目上?这个就是我们整体的一套的一个后端的一个工作,但开发前端肯定是不同的前端有不同的开发工作,后面我们会逐一对不同的前端进行一个相关的一个介绍。我们这个章节呢,主要是对 那整体的后端的项目就是一个概要性,或者说比较浅显的一个功能的一个介绍,以及大概了解整个项目的来龙去脉。这样子我们在着手整个后端的开发或者增量的开发的时候,就是有一个很 直观的一个认识吧。好,这个我们刚才讲了这个第一个要点呢, fast api 的 介绍呢,跟它的特点有包括有两个部分,就是这里就是它的一个介绍跟主要特点我们都过过一遍, 因为这个东西呢,虽然说不是特别重要,但是呢他也是我们呃给我们提供一个入门的概念的一个了解,知道他的呃渊源以及他的使用价值,功能特点,这样子就非常好的一个铺垫。 fos api 呢,它实其实实际上是一个现代高性能的一个 web api 框架,它的全身可能有很多类似的类似单呃就是坚狗啊,还有那个 flash 啊, 就是以前都是比较有名,但是它 fos api 也是个后来者,相当后来居上吧,相当一个比较呃广,现在应用比较广泛的一个 fos api 的 一个服务的一个标准嘛, 我们大概了解它是拍审称,其实是在开发的一个事实的一个标准框架来的了。呃,第二个呢,它的特点可以快速地生成一些 open api 的 一些以及追审的 skimming 的 文档。 因为我们了解到 web api 开发的时候,知道这个东西一旦生成的话,我们就可以构建它的文档的显示,它就整合了那个 swagger, 就 这种行业标准的一种展示吧,这样子对我们呃查看文档啊,各方面就非常有帮助,就会一目了然。 然后还有它是使用这个 style 的, 作为 web 框架的一个核心,还有派单,派单体课,它是个数据认证的一个标准来的了,就是相当于我们可以呃对数据的进行一个验证啊,处理啊,就非常方便。 好,这里大概了解一下哈,我们就大概有知道这个东西,刚才讲了他拍单口的,他是跟 flash 啊单真狗啊这个类似的一个开发体验,而且有各自而无不及。很多东西呢,他是在 就是在借鉴这种呃以前出现的这种框架的基础上,会改良了很多东西,而且他在异步的处理会更快,更,呃性能上会有更高的一个一个反馈啊, 这就是它的一个整体的东西。所以呢,我们呃对它了解就是要有一个大概的一个认识。 嗯, fox api 这个我们呃它的框架的特点大家也讲了一些,就是它性能,在衣物上的性能会更快,而且也会比较简洁,因为它很多是通过标注性啊,或者说带就是一些命令的东西都会处理得更更方便一点。 自动文档的生成呢,就是我们刚才讲了我们做一个后端跟前端对接的时候,有一个自动文档生成呢时候我们用 swag 来整合呢,看起来就非常方便,那也很 就是一种行业的标准化了,这样子我们就非常能够直观的使用各个各样的一个接口。嗯,还有数据验证这块呢,它是呃派单克是在拍审这这块做的数据验证是非常好的,对,我们很多时候要求数据的一个 就是可能 b 田啊,或者数据的一些约束性的东西呢,我们可以进行一个验证验证,呃,这样子就可以提供比较复杂数据的验证和数据解析吧。 还有一个类型提示,这个我们后面会讲异步支持,也就说它主打这个异步还是比较方便,这种异异步在那个 i o 的 吞吐量或者响应的速度上肯定是比同步的会快一些了。 依赖式注入,这种是很多时候我们很多接口都会提供一种依赖注入的方式,相当于就可以很方便的做这种管理,这种依赖项也就不会呃,就是直接绑定的这种方式。 呃,还有一种其他的功能,就是大家了解有文件上传啊,或者说呃这种安全性啊,后台任务这种就是常规的这种后端框架都基本上支持的了,这个我们就不多讲。 好发四 api 的 后端开发框架呢,这个是我们整套项目框架的它的特点,我们大概呃就 概要性的讲一些几个特点,就这个框架的本身它就是基于拍省的基础上来做的,所以它就是一种跨平台的运行,跨平台的开发,跨平台运行就是我们可以部署在不同的 呃操作系统上,如 mac os、 windows、 linux 以及我们国产系统上的一些平台上,这样子就实现我们真正的跨平台运行。 因为国产系统很多也是基于底层 linux 做的一种系统,例如例如我们那种国信啊什么的,还 基于 vs code 的 这种,我们它本身开发就是一种跨平台的开发,就不管你是 macos 开发还是说 windows 开发,就它的开发体验,开发界面都完全一样的。所以呢, vs code 的 这种就是 跨平台的开发,是非常方便,不管你用哪一种平台来做,我们都非常方便,因为它其中的插件呢,已经什么的界面标准都是一致的。这个如果你在 macos 开发也是效率非常高啊。 如果我们还有一个就是这个整套框架,它是严格的这种前后端的分离的模式。 呃,前后段分离模式很多时候现在也是一种标准的,就是我们不管是基于抓瓦的,那那个不,呃,那个叫什么 呃抓瓦的方式或者断代的方式,它都是一种前后段分离模式,因为这种呢可以有利于我们在后前端做各种各样的对接,例如我们可能是基于这种 v o v 三的 b s 端框架啊,还有 呃 python 六,呃, python 六的那种 python 端呢?还有微信 python 的 这种 python 端和这种是两个都是做那种 python 的 桌面端, 还有 h 五端或者小程序端。呃,还有其他的各种各样的接入,它都是几种 a p i 的 标准接入,那所有其他的接入呢?就是都是一致的,所以我们这个也是严格前后端的一种分离模式的一种好处,还有 完善的基础功能。我们整个框架已经提供了很多标准性的一些功能了,包括我们用户啊,角色机构啊,以及菜单的功能点,就是权限点的管理啊,这些以及日制, 包括操作日记啊,以及登录日记啊,或者说其他的你所需要想记录的一些错误日记啊,这些信息都可以啊,还有字典啊,附件啊,编码规则,是我们一直一直以来为了一些重用做的一些规则性的一些功能模块了, 可以在整个正量式开发的时候,一个业务系统的时候就非常方便的使用这些功能啊,还有用户权限的质段权限功能权限的这个控制的管理就可以很方便的整合起来。嗯, 呃,这个我们讲讲这个功能点,然后我们回头再看看他的一个界面的。呃,开发的一个东西哈,先大概了解下他的功能,因为首先我们要有一个大体的认识,因为框架的东西首先要功能点要讲 啊,好,还有菜单动态的展示,也是一个跟权限相关的一个东西,权限呢,我们可能控制到一些页面的功能点啊,数据线,还有个菜单,它也是作为一个资源来单独控制。呃,框架本身还有个多数据库支持的,因为我们很多系统可能, 比如可能我们在 linux 跑,可能又用喜欢用啊, micro 啊,或者说 posgrid 这种数据库比较多一点,或者 oracle 如果是在 windows 上可能用 cisco 会多点,这种就支持不同的数据库,因为我们在开发业务系统的时候,还真的不确定用户会指定哪种数据库,呃,通过 oim 的 方式能够呃统一整合各开发不同数据库的一个对接呢,就非常方便了。 还有我们呃为了开发框架的方,呃增量开发的方便,我们在代码生成工具上也下了不少苦工 啊,让他更好的为我们服务。可以生成一些后端呢,前端的一些接口,后面我们会讲一下这个内容 啊,基础的业务放行接口呢?抽象,因为我们不想每次开发一个功能都是很累赘的代码,那我们通过这种基础功能提供放行的呃 抽象处理,那我们只需要在啊那个控制器层或者说那个数据访问层,只需要继承它的积累,那常规的 c i u d 接口,就酷路接口,或者说一些分页啊,或者一些呃判断存在啊,这种接口我们都可以已经封装在里面了,而且是通过这种幻形的方式呢,还是比较有点强类型的方式吧,就这样第一个可以减少代码,第二呢也是可以重用啊, 提高效率来开发,不要每个功能都是写一大堆代码,每个代码都差不多,那就没必要,因为我们相同的代码基本上呢都是把它整合在啊抽象类里面去,这样重用非常高效。 好,这就是它的特点。然后这里面就是它的一个后端框架,我们在这里之前我们大概讲看看整个项目的一个内容, 我这里就把这个项目打开。这个项目里面首先如果是个是个独立的一个项目,就后端项目是独立的,我们刚才讲了前端后端是严格分离的,它是这一拍摄的,所以我们就是用 vsco 来进行开发就可以了, 就不需要其他什么任何工具啊,数据库。如果你需要做创建啊管理,那我们就另说啊,一般可以用这种标准的。呃,我们这里讲的就是 navigate 这个来做,我推荐是用这个,这个不管你是 micro or postgraduate 啊,或者说是 ccla, 甚至都可以进行一个统一管理,我们这里有个 micro。 呃,这这个数据存储相非常方便,反正这种备份啊,还原啊都可以基于这个操作。如果是个 server 呢?那你就用标准的是个 server 来做就行了。 好,这就是我们刚才讲的。呃,项目那块我们这里提供了。首先如果是入手项目,我们大概了解一下整个项目的它的一个 结构点嘛,待会我会讲一下。但我们首先项目的话有一个标准的 readme 的 这个标准的说明,如果你说是需要预览这个,因为这个是个就什么,就 呃, md 的 一个文件,它就是很很标准的一种这种格式了。然后如果我们需要预览这个它呢,我们就可以 可以通过预览方式把它看的更直观一点。呃,这个都是我们了解这个格式之后,经常 可以做预览的方式来。这样的,这里我会写了很多相关的步骤,这个也是贯穿着我们整个视频的一个一个内容,会在里面也会穿插着讲,那我们先回到整个项目里面去。呃,那个 ppt 里面去,因为这里我们待会会逐一讲的。 好,这里是,然后我们发射 a p i 后端框架的一个主要特点呢?可能他刚才讲了,它是可以通过 switcher 来整合,我们这个可以查看。如果是你段内啊,或者说是抓把的开发,它都有这种接口的整合,这种是个行业标准,我们可以对 每个接口进行查看,像例如这个它包含哪些接口,呃。我们把它视为顶层, 这个每个接口都列出来了,我们查看每个接口,或者甚至在上面通过授权提供数据。呃。登录授权或提供一些,呃。令牌之后可以每个接口进行一个测试, 当然测试可能在这里测试可能会比较麻烦一点了,我们可能会利用那个 api pos 的, 我们后面也会单独的也会讲一下,这个是我们开发调试的一个利器来的。 呃,当然还有其他类似的一个工具,我是倾向于使用这个,它就是相当于我们。呃,利用,我们可能大概参考一下吧, 我们可能会做一个登录授权,这个就是我们提供一个登录授权的方式的话,或者获得令牌。那我们现在那个项目还没启动起来,我先把它启动起来。呃,一般启动起来,呃,可以通过我们打开的 app 里面有个魅函数, 我们回头怎么把它弄起来呢?我们会讲到这里,我们直接把它运行一下就可以了。 呃。这里会有一个过程啊,它,它,它会有个启动,这个叫什么?虚拟环境,然后它再直接启动起来。我们大概有为了 避免太多口水话,我们这里会讲一下让他怎么跑起来,让他聊个直观的了解,这样子呢,我们会有更明确的一个了解这个系统的一个功能。 好,它这里通过这个绑定它已经起来了,它端口就是这个,这个相当于这个零零零是代表,它包括啊幺二七点,零点零点幺,它跟本机 ip 两个端口,它两个 ip 它都已经绑定了,就像我们不指定 ip 都会有一个 两个地方都出现了。好,我们这里呢,看到它起来之后,我们就可以进行接口。刚才讲了 api pos, 它是做 接口测试的,那我们提供标准的这个路径,这个 pose 的 模式,因为这个接口是 pose 的 方式的, 这个一定要了解,但是这里有很多种方式,不同的方式代表不同的动作,这个做 api pose 的, 呃,不做 api 接口测试的话肯定会了解,那我们这里啊提供一个 body 的 数据, body 数据是通过 pose 的 方式来提供的,那我们测试一下。这里如果是 啊 token 过去是因为我指定了一个 token, 那 如果是一般来说,我们通过全机参数,我们取消这个全机参数 就可以了,因为这个是一个 token, 因为这个接口一旦获得这个令牌呢,整个其他的 api 呢,我们都可以通过全机参数的方式来把它指定,然后做相关的 一个复制过来,相当于我们就会带有一个 head 的 令牌的信息,这个是协议 格式,然后出填进来就可以了。那我们如果是说要测试其他接口,因为我找一个刚才像我们这里测测试一个所有字典的接口,我们发送一下, 他就会获获得这种接口的返回啊,这是我们先获得令牌再测试接口,就是我们常规的调试的方式。 好,我们到这里呢,看到我们整个这里接口的 大概功能了解,然后这里面我们刚才讲了这个户单它返回的接口,它是有个统一的一个协议标准的,因为这个统一的协议标准会给我们在开发对接的时候非常方便,因为我们基本上它的头部信息都差不多呢, 变化的话它就是一个 result, 这里面这个 t 代表一个变化的一个类型跟数据。例如我们返回一个列表,它可能就会有个 total count, 还有 items 这个一个数据的一个集合。 呃,它就是类似于这个 result 里面就是一个可变化的一个对象,包括可能是一个列表啊,或者说是一个簿啊,基础的类型等等这些。那我们后面测试的时候肯定会跟成经常跟这个对接的啊 啊,发射 api 它的后端框架的那个还有个换行接口,刚才我们讲了为什么用换行换行可以很好的抽向各个业务类之间到我们实际的接口,而且还提供类似强类型的这种方式,这样子我们 可以减少代码的同时呢,还可以就是我们使得我们对那个接口啊更更方便,因为它是强类型化的。 然后这种还有底下他这个控制器层,我们做了一个 g 位抽象,还有个数据访问层,我们也做了个 g 位抽象, 这样子都是为了第一个统一标准,第二就是名称啊,操作名称都一样。第二呢是为了减少代码,还有这两个是一对应的,所以很多时候呃,你改一个,再增加一个这样的一对应上就非常方便了。 好,呃,发四 a p i 还呃这里面,对,这里还有呃后端开发框架,还有个放行抽象,我们这里大概给出两个一个实际的一个例子,你看我们这是截图里面,代码里面截图,这个是控制器,它传入了一个放行的这个想传了几个类型, 这就是我们标准。我们端内框架也差不多是类似的一个定义力提供一个类型,然后组建的类型,然后那个分页 dto 的 一个类型跟呃 dto 的 一个对象,以及呃这个常规的征删改查的那个标准的 呃那个 dto 类型啊,就这几个类型传进来,就我们通过构造化就传呃构造了一个器类的一个控制,并且这个信息传进起来之后呢,它一些接口也就是强类型化了。 好,它的数据访问层也是一样的,它也是要传入几个类型,这样我们通过这个配置 dto 可进行分页的一个处理。 外界类型我们可以做一些增生改查的一些关键的一个对应的一个啊类型的一个限定哈模型这个类型,这个是我们这个 直接访问数据库的时候,它对应的一个模型的一个对象类型了,这样子我们可以获得表的信息啊,以及相关的一个操作的一个便利性。 好,这个会可以实现。看代码的时候可以看到我们回到这里面可以看这 base control 了,我们大概结合的讲它就是这个东西。好, 我们会看到这里面它就提供了一个呃范型的一个定义,我们这里 促使一些标准的一个常规的一个接口,这个接口这个定义方式我们可以到时候参考一下, 利用我们这个判断是否存在那个他都在这里定义,这就是常规的那个发誓 api 的 一个定义方式了,就通过这种声明式的方式来定义它的类型。我们这里可能就是利用可能 id, 就 id 就是 一个这个组建类型,然后名称的标标识 还有 db 这个数据库默认它是直接构建的,它就是一个依赖式的一个东西,用完它就会会把它注销了后,不是就把它相当于丢掉 或者留在缓存里面重用,就是这种的一个模式啊。这个返回的这个统一的标准就是我们的这个返回的一个结果,把这个结果为绕的塞到这里面,就构建一个通用的返回的一个协议格式啊。 同样在那个 code 层,我们这里有一个叫 base code 安信,这个呢它也是通过跟那个之前讲的,它是通过发行的方式来进行一个定义, 然后实现我们这里面有一些接口的信息,我们到时候可以逐一的去看。这里可是花了大功夫的对各个常规的接口进行一个操作,每个接口都保证它比较 返回正确性啊,这个需要啊,统一测试好。嗯,这个就是我们对整个所有公用性的接口进行一个底层的一个处理了, 这个回头细看就行了,大概了解这两个机类,然后每你看所有的每个类类,他都会继承这个这个信息啊,这样的话我们很多常规的接口就不用再写了。你看这个其实这个数据 类型啊,或者说是数据四点它里面的信息,它是非接口是非常多,但是我们只需要定义一些特殊的接口就行了,常规的接口都是在这上面定义, 嗯,这就是我们用到的这里用到的一个换行接口的一个好的一个地方啊。还有就是 凡是 api 后端开发框架呢,它里面啊,这里另外刚才已经讲了,这块我们跳过就是继承关系的一个处理啊。还有个后端框架的一个多数据库支持我们啊, 跟他讲了 sql 它本身就是个很强大的 o m 库,它在我们呃提供 o m 库呢,它其也保留了底层数据库存储的一个呃 sql 操作的一个强大的控制力,我们可以通过呃 sql 代码跟数据库进行一个交互,不需要编辑呃 很多,它有它的模型操作方式,由于它进行了多数据多种数据库的抽象能力,我们可以很好的支持这种不同的数据库的对接吧。 还有它的 emv 的 配置,我们通过因为我们做了底层做了很多对接的一个优化的处理,那我们通过配置方式可以直接切换为不同的数据库引擎以及呃相关的操作模式,就很容易实现了。 这样子的话,我们在这个配置文件里面,这个就是它的 emv 的 一个配置文件中啊。关于数据库的部分,我们通过呃这个 db type 这个类型,我们实现呃不同的一个切换,这样子我们就实现我们不同数据库直接修改配置就可以了 啊。还有个异步操作,因为现在基本上所有呃对数据扣操作的用异步的话,它会更高效更快速的响应,因为它的 i o 存储,呃实现的响应是快的,很多的同步可能会有点阻塞啊,或者会 收干扰啊这个,但是异步呢,它可能很多时候我们要转换观念起来,使用起来就也很方便。好 啊,刚才讲了 skyelink 就是 一个强大的 o m 工具 o m 库,它比较它可以说是啊拍摄生态生态中最最成熟啊,也是最强大的 o m 空框架吧,当然肯定还有其他的,你如果,呃 是比较喜欢这个就用这个,大大多数人都会用这个,可能会比较比较熟悉一点,还有其他的一些 o m 工具,如果你历史原因也可以用其他的,这个问题不大啊。 呃,他的主要特点就是我们通过对象的印色推出,我们定一些模型就可以印色到实际的表里面去,还有他提供了一些自己的一些 c 口的表述的处理啊, 数据库抽象,刚才讲的他就为了兼容多种数据库,这样子的就方便,然后高性能就通过呃缓存呢易步啊这种方式来实现这种高性能的一个处理,还有个支持事务。有时候我们可能 对,特别是我们这种关系型的数据库,有些一些 c d 度的东西要统一保证的话,那我们需要增加一些事物的处理,这样对我们啊一些数据的唯一性的检查会比较好一些,这就是我们啊在这边的一些功能点啊。 好,我们前面讲了,因为 fast api 的 后端框架呢,它相当于是一种数据中心的模式,它就是通过 共用一个 web api 的 一个对接,那实现统一数据对接,呃,其他前端对接的一个模式,这就是我们大概我画的一个 u r m 图,就例如我们桌面端可能微微信拍选的,或者拍 qq 的 这种 啊,跨平台的桌面端,还有啊 b s 端,还有 h 五端,小程序端或者 electron 的 那个端 啊,还有其他都可以, inform 端子也可以对接,都一样的,它鞋口鞋底都遵循一样的话呢,操作起来都是差不多的啊。发 c p r, 我 们这里为了 我们知道我们开发的时候可能需要根据数据库相关信息申请进行一些生成, 那我们如果是全部是从头来,第二可能会容易写错。第二呢也是会很繁琐的一个功能,因为很多数据库的字段跟我们实际编写的一个类的属性,那可能是一一对应的,那这些东西就交给代码生成工具,因为我们这次上面也画了 很多功夫,让让它快速的生成,而且就是符合我们框架的一些标准。这样子呢,有相关的一些基层关系啊,以及相关的一些注示啊,以及相关的一些说明,那就非常方便。 离我们后端框架生成之后,它包括 api 端、数据访问端,还有 dto 跟呃斯柯尔柯米的模型端都进行一一并的生成,那这些生成之后我们再着着行的修改或者调整一下,那就可以了, 这是我们框架的一个特点啊,这是用代码生成工具生成的文件,我们可以看到这个文件的,基本上我们都跟那个一对应的,也可以看到 啊。第二第三步呢,就是我们在做开发环境啊,先录到这里。

上节课呢,我们已经将之前了解过的技能整合到了这一个 python 文件里边,我们会发现当前这个 python 文件里边只有三个接口, 但是如果说我们想去修改其中的某一个接口时,那么这时候我们找到对应的代码时,其实比较费劲的, 因为你会发现我们要去拉动滚动条,哎,拉很久,然后再找到对应的这个路由,还要去区分一下,看看到底是哪个业务的路由,然后再去定位具体的那个路由,对不对?好,所以说的话呢,像目前这个情况呢,他维护起来是比较费劲的, 那么这时候呢,我们就要去考虑将这个文件呢划分成之前我们了解过的项目结构,也就是说我们需要将这些代码呢分到不同的文件里边,而不同的文件呢,他还可能在不同的文件夹, ok 吧。好,那么这个东西到底怎么去实现?来,我们一起去看一下啊, 那在这的话呢,我们就以当前目录为例啊,我们就在这个根目录下啊,在咱们当前这个 fast api 扣的这个根目录下,创建一个文件夹来创建我们的项目就可以了。好吧,好,那在这呢,我们创建一个新的文件夹, 创建一个新的文件夹呢,这个文件夹的名称呢,往往呢就是项目的名称啊,你比如说我们这是房屋系统,就是 room 啊,下划线 system 啊,如果说是其他的一些项目的话呢,哎,我们就根据对应的名称去修改就可以了。好吧,好,那么在这的话呢,我们就以 project 为例,好吧,好,那么写好它了以后呢,然后在这里边我们需要去创建对应的工程目录, 这工程目录呢也比较简单,因为我们之前在咱们这个文档里边啊,就已经看过了,那我们可以等会再去回顾一下,比如说我们可以按软件功能来进行划分,也可以按照业务模块来进行划分,对不对? 好,那么在这呢,我们就以软件这种方式为例啊,以这个为例,这个会了以后,你再去改其他的,基本上也没什么太大问题啊。 好,那么我们再回到咱们这个代码这边来,然后在这的话呢,我们需要去创建一个 man 点 py 文件,那么它的主要作用的话呢,就是启动项目 啊,启动启动项目,当然这个启动项目的话呢,肯定是要有主应用的那个 app 对 象嘛,对不对?所以说呢,在这我们要追加相应的代码,这个代码呢我们一会再去加,我们先把这个目录先给它创建出来。 好,那么有这个 project 以后呢,然后在里边我们再创建一个文件夹,叫做 app, app 代表的就是我们当前的这个主应用啊,我们所有的应用代码呢,全都存放在这里边, 而在这个主应用里边呢,我们需要去创建对应的文件,你就比如说啊,我们呢要跟数据库做交互,对吧?那我可能就要去创建 models, 跟数据库做交互的这么一个文件啊。然后再其次就是我们跟前端用户啊要做交互,那么它在传参数的时候是不是我们要做限制啊?所以说的话呢,我们再创建一个叫做 scammers。 好, 那么除它以外的话呢,我们还可能啊,要跟数据库做交互的时候呢,有一些配置信息,这个配置信息呢,我们就可以给它加到 configure 里边啊,然后再就是专门管理数据库的, 那么目前来说的话呢,咱们仅仅是用了一个 my circle 数据库,对不对?那么后期的话呢,我们可能要跟多个数据库做交互,所以说呢,我们专门有一个专门处理数据库的这么一个文件好,那么除这以外的话呢,还有一个比较主要的东西叫做什么呀?叫做 root 啊, root, ok, 好, 那么目前来说的话呢,现在啊,我们这个核心的啊,核心的这几个文件就算是搞定了,那在这我们需要去注意的就是我在这个写这个东这个名字的时候呢,有的加 s 了,有的没加 s, 这个加 s 的 话呢,说明里边可能会配置多个啊,当然像这种 this b s 的 话,后期也可能会有多个,但一般情况来说的话呢,它并不会太多, ok 吧?所以说在这我们就不再去加了。 还有就是这个名称的话呢,我们如果说到了公司以后啊,要按照人家公司的规范去来看一下人家怎么去写的,如果说他们没有明确的规定的话,好,那么这时候的话呢,这个 s 你 可以加,也可以不加, ok 吧? 好,那么这是这块成,那么这搞定了以后呢?然后这个 root 里边呢,我们要根据具体的业务来进行划分,你比如说,哎,我现在有用户模块,好,那我就加上一个 u 字儿,对吧?那么我就加上一个 item 啊,点 这个文件好,然后再起的就是这里面呢,还要创建一个 i n i t, 就是 python 包的那个模块啊,这个文件好,有它以后的话呢,然后再起的就是我们在 app 里边的话呢,可能会要去设置一些中间键,那么所以说的话呢,我们在这要再去创建一个叫做 middleware 这么一个文件, ok 吧?好,那么把它创建好了以后, ok, 那 么整体的啊,咱们这个目录结构就算是搞定了啊,就是最应该说是一个简化版的吧,咱们就算是搞定了,那么后期的话呢,我们可能优化地方啊,就比如说我们到企业了可能会优化的地方,那么有可能就是比如说这块 啊,像这个 model 这块,还有这个 skimmers 这块,那这块的话呢,可能啊,就比如说我们的业务比较多,那么我如果说我把所有的这个业务模型全都放在这里边的话呢,会比较乱, 你就比如说我们这个商群,呃,就比如说我做一个这个项目吧,这个项目里边已经有一百多个表了,那你想想一百多个表全都放到这一个文件里边, 哪怕一个表只有一行代码,这还一百行代码呢,对不对?所以说面对这样一个情况的话呢,我们就有可能要对这些模型呢,再进一步的进行划分, 那么再进一步的划分的话,那么这时候怎么办?我们是不是就可以按照这个 root 的 方式进行做?你比如说我在这的话呢,就创建一个文件夹,叫做 models, ok, models 里边,然后再分别去创建不同的这个文件,不同的文件呢,就是负责专门管理不同的模型, 对不对?好,那么这个当然这个不是说一个文件里边只放一个模型啊,只是说放相关的模型,好吧,好,那这样的话呢,我们就可以把多个模型给它进行分拆分啊, 那在这的话呢,我们就不再去拆了啊,因为我们这个模型并没有那么多,好吧,好,那么同理 scammers 呢,也是一样的,那中间键的话呢?有的时候啊,可能会需要对这个功能进行划分 啊,你就比如说有专门针对于某个功能的这个这个中间,或者是专门针对于某些业务的,那么公司如果说需要划分的话,那么好,我们就给他划分,如果说不需要的话,那在这的话,我们还是用同一个文件就可以了, ok 吧?好,那这是这块啊, 成,那么这样搞定了以后的话呢,关于咱们这个创建文件夹,基本上就这么一个意思啊,其实路径基本上就是这么一个情况,后期的话呢,哎,也可能会有变更,但是基本上大同小异,咱们了解了他的一个思维就可以了,其实说白了就是什么呢?就是可以按软件去分,也可以按这个呃业务去分。


fast api 后端开发框架、配置文件和项目结构。 好,前面我们讲了一些就是关于安装开发环境以及怎么运行项目的一个操作 啊,我们这里呢可能呃运行起来呢,可能对项目有一个大致的一个了解,包括我们查看他的接口文档,就是有个直观的一个了解吧,就是作为后端的框架,他除除他就是呃提供一个基础的一个接口的对接啊,那后端 呃包括数据库的操作呢,也是后端的一个处理的一个功能。好,那我们如果是说要做一些修改,因为很多时候涉及到数据库啊,以及一些其他的一些参数的配置,那可能我们一般项目呢都是统一管理的, 这个 fast api 的 项目也不一样,呃不例外,它也是通过 emv 的 这个配置文件的方式,就是一个 kv 的 方式来进行一个配置的一个管理的。 那我们这后面那个讲了怎么修改它的配置信息,那怎么讲修改之前呢,我们要了解这个 emv 配置文件的一个格式,以及我们有做哪些参数的一个配置。因为我们你看我们环境里面有很多涉及到 呃端口啊, ip 啊的运行呢,还有密钥啊,参那个邮件啊,短信啊,以及呃数据库的相关的存储性,呃密码账号啊或者类型啊,这些东西都是放在那里面, 那它包括有 letis 啊, mongol db, 还有售售啊,或者 mechat 的 这种数据库的配置,还有 fast api 端口呃相关的一个信息, 那这个信息呢,我们一般不是通过这种呃原始的方式,就是 os get emv 的 方式来读起,这种方式也是可以读起,但是它还有我们因为发誓 api 它本身就是跟那个 pyndic 绑定的很很远, 就是所以呢,我们可以通过它的另外一个组建去 pyndic 的 一个 setting 来进行一个整合处理,这样子直接就可以把它那个呃 emv 的 那个 key value 方式转为我们对应的一个 拍损的一个对象的属性的方式来管理,这样子会更方便一点。那我们来回头我们来看看这里的一个变化的一个信息,我们回到项目里面去,项目里面它那个配置信息我们大概这里看一下哈,它是在 emv, 就 在 app 里面的目录下 呃目录下的一个 emv 的 一个文件,它跟 main 它就是那个同级的,就是它这里面包含了很多信息,包括我们数据库的一个配置信息, 因为这个信息我们呃抽象了,因为它把不同的数据库信息我们统一从配置,因为这里有说明它是根据这个不同的数据库类型 进行一个转换的,然后端口这里有一个默认的规则在这里面啊,大概了解一下就行了,就知道有这个呃,它是通过 key value 的 方式来进行一个呃配置信息的一个呃 修改,因为这个文件最终发布部署的服装的时候,他也是个独立的文件,所以我们啊不需要改代码,但是直接对这个文件进行一个单独的修改,然后重新启动程序,那这样修改就已经 生效了,那这样子就非常方便。这个对解释配置文件的它的一个就是作用所在啊,这里还有个蒙狗 db, 蒙狗 db 呢,在我们用到那个呃属性值管理的时候就用到这里,如果是说你要存储在蒙狗 db 上了一些数据,那也可以,它反正这里有相关的一个操作类以及相关的配置信息。在这里面还有个就是我们这个 web 接口的一个信息的一个展示了,包括它的名称啊、标版本啊以及描述。这这个其实就是我们在这里面看到的。 呃,等会我看看这里面的一个说明的信息,这个信息我们修改 的话,这在这里面马上就能够变化。然后他还有我们做令牌的时候,他要给一个一个加密的键啊,跟那个呃处理的加密方式,这个了解一下就行了,一般修不用怎么修改,修改的话就修改这个也可以 啊。另外我们呃对 ip 端口那个运行启动的话,我们一般要做一些设置,例如有可能我们有有些项目部署到服务端的时候,他的那个端口可能不一定是可用的, 那我们就可以动态的修改这里了。假如你八千被占用了,我们用九千八千零一、八千零二也都没问题。这个到时候我们通过配置方式来把它 啊启动起来之后呢,我们就用了新的接口了,那这那那个端口呢?我们也就在前端那里修改一下就行了,这个也是要可以弹性配置的,否则的话一旦冲突你就没法启动了 啊。这个是另外一个 linux, linux 一 般来说我们也是一个账号密码,如果是说呃没有密码的话,那默认保留这个就可以了,一般来说我们保留密空密码就行了,除非你对安全性很严格 啊。另外一个这个就是其他的一个配置信息了,我们大概了解就行了。邮件呢?还有还有阿里云的一个配置信息,这个你根据你的阿里云或者邮件账号,这个主要是我们做一些通知信息的时候用到啊, 这个是我们的一个配置信息,刚才讲了这个配置信息就是通过那个拍 dante 那 个 setting 的 方式来直接整合到那个对象里面去。我们看看这个 config 文件,这个空 config 文件就是统一最全机的一个配置信息的一个管理,它通过通过一个 base 点,这个就是这个里面的一个基础的 playstation, playstation 设定的一个基础对象,相当于我们直接通过这个设定 config 的 绑定的这个具体的路径的方式的,之后它就会自动加载这个 model config 里面的一个值, 这样子的话它先借用 key value, 我 们也就重新再定义一次。呃,这里呢?它是相当于如果你你定义了这个值,它会提供一个默认值在里面,如果是你不定义了,它直接就通通过这个里面去。呃,拿那个 配置信息里面。但是一般配置信息有时候可能就是怎么说啊?有时候就是我们会 额外的就是修改一下,我们可能会增加,那如果是默认,我们可能不一定在配置信息里体现,那它这里就有个默认值的概念了,就默认是通过这个默认值来处理,那如果是有那个 e m v 的 值里面有的话,那就通过 e m v 来配置。 我这里一般都会给一个默认值,因为这个 key value 必须要定义一个 key 的 这个 key 的, 否则你那个 set 里面你,否则你就拿不到了,相当于它就是一个属性, 那它我们最终构建了这个函数之后呢?就一跟那个一对应之后呢?它在 new 的 一个相当于一个一个对象出来,这个对象就相当于很多地方我们都会用到,包括我们 main 函数里面可能,呃,我看这里有没有用到,呃,就我们很多,呃,我给你看一看那个 很多 setting 里面我们可能都会要用到直接印印破的那个 config 的 setting, 你 看包括我们这个这个里面的一个注册, 这个是启动程序的一个注册内容的时候,它就会用到这里面的一个 setting, 直接 import 的 这个 setting, 那 个 setting 的 话,我们就在很多地方直接引用这个属性,是吧? limit, 这个我们可能要限流啊,做一些处理或者 read 的 处理的时候,这个我们或者说我们启动程序的时候它的名称啊、版本啊, 然后这描述啊,这些就是我们后端接口的一个配置信息吗?那我们这些如果直接通过这个方式,我们就可以能够直接读取他的参数的信息了,这样就非常方便啊。 我刚才讲了,我们这里如果是说我们要修改的话,我们这里其实可以通过修改这几个参数就可以了,这参数也已经配置了各种 不同的类型啊。我们这里就不再讲,刚才已经展示了一下项目里面对应的相关的一个配置信息,我们这里的啊提纲的大概就了解一下。 好,刚才讲了这个配置信息里面有数据库啊,蒙古 db 或者 letty 或者其他的相关的一个参数,那使用的时候这里面呃这个 emv 啊,这个是不是啊?还有另外一部分,就截图截了两个部分,就是这参数信息比较多啊,大家了解一下, 还有对应的 config 文件,它就提供一个默认值,没有没呃,否则的话它就直接读取那个配置的信息, 就是一样的一个操作哈,这就是我们刚才讲的那个配置信息以及如何修改配置信息,因为配置信息在我们部署啊,或者说生产环境的时候,我们可能会着重的修改的嘛,所以一定要给一些关键性的修改的一个参数在里面,否则的话 一旦碰到问题再改密码,改改代码再变异,那就被比较累了,而且也减少了很多呃,硬编码以及对一些关键呃比较敏感的配置信息的一个暴露的可能性啊,这就是它的作用啊。来啊,我们再次看看整个项目的一个结构层次, 在开发的时候,开发之前吧,我们至少要了解各个目录他是包含哪些信息,或者说他代表什么含义,否则的话我们就抓下,我们不知道把东西放到哪里去 啊,这个就他是相当于呃主要的目录呢,他就是有个括目录,可能就是啊,我们关键的一个安全配置信息,大概了解就行了,就是我们整个项目的一个基础的一个设置信息里面 包括刚才的 config 或者是放在里面了,它 api 就是 我们的一个路由的一个定义啊,我们待会我们先过一遍,然后待会再回到项目那个视图里面去看啊,我们 api 里面有一些路由啊,包括一些版本的管理 啊。 model 就是 我们数据库的模型,因为我们建模建 oim 的 映色,它就是有个 models 必须跟那个数据库绑定关联好,否则的话它是没法通过模型的方式来直接写入数据库的。 通过模型的定义之后呢,我们操作数据库就直接用 oim 对 象的方式来操作,那就非常方便,也比较符合我们在开发过程中的一些理念 是,根本呢,就是我们啊相当于跟啊前端对接的那块的一个数据交换的一个对象了,因为我们一般用用为啊指 dto 的 对象,就是传输的一个对象,数据传输啊的一个对象。 库洛特的就是数据操作的一个,因为我们每个表啊,他可能都要提供一个对应的业务的一个库洛的一个类,这样子呢就是对不同的表,然后他有不不同的一个操作接口定义在里面,这样子 我们也可以通过继承的方式来继承他的常规的操作,以及增加自定义的接口操作啊,这就是他的 目目标啊。 db 呢,可能就定一些数据库相关的一个设置跟绘画处理,因为我们每次请求怎么发起的数据啊,怎么对 一些数据的一个促使的话,或者包括我们可能有时候定义了模型之后,我们可以通过呃模型的这直接生成数据库啊,这种方式都对 db 这模块里面定义, 就包括绘画以及啊一些基基础的类吧。 youtube 就是 我们做的一些工具函数啊,为了方便我们分装一些公共的一个操作函数在里面 啊,就是主要是为了通用,常常用啊,啊, common 这个里面就是一个通用代码啊,它通用的东西跟这个上面也类似,但是可能有些小细小的差异,大家理解就行了。 呃, midwave 就是 我们的一个中间件,例如我们可能就是,怎么说呢?我们在接口啊,授权认证的时候,我们肯定就需要一个 midwave 来管理,因为 它的对那个令牌的处理啊,以及日制的处理啊,这就可以通过中间件的方式,相当于,呃,一个层层叠叠的一个就一个拦截的一个处理的一个链条吧,相当于啊,链条最后最终呢出处理完了再丢给我们。 呃呃,前前端或者说这个后端它是作为这个处理的。呃, template 都是我们做这个 html 的 模板,就是我们发邮件定一个模板,然后改变一些参数或者是短信,这个模板都可以。其他 type 的 就是我们为了方便做一些 快速的一个 snippets 的 一个代码段吧。好,这个呃里面这个是 o r m 的 里面的一个对象。我们先不不讲,这里我们看看那个项目里面的结构, 项目里面结构的刚才讲了就是,呃,我们从 a p p 里面开始,我们 database 里面释放我的一些存储的一个数据库的一个版本,以及呃,它的一个操作说明,这个就是一个相当于恢复数据库时候用的 love。 是 是这个日制,然后 myemv 是 我们的一个 啊心理环境的一个所需要的一个文件,它是系统创建的,然后这里呢有一个 lead me 跟那上这个很重要哈。然后呢?还有一个就是我们这个项目的一个介绍吧。 这个,呃,六块门就是我们这个项目里面的依赖啊,这个是这文件,然后我们再回收到。呃,这个 app 里面就是我们主要的一个项目的一个文, 呃,代码的区分的一个大目录,然后里面包括有 api 的 目录。 api 目录有一个相当来说我们有个积累的一个函数嘛,呃,积累的控制器, 呃,就是这里面定义了所有常用的接口,呃,为了方便啊继承,然后做了很多抽象的一个接口处理,然后这里做了一个,呃,这里可能就是作为转转换的一个辅助类吧。 嗯,没什么特别的意思啊。这里 v 一 啊, v 二那个只是个目录区分,我们大概知道。然后这里面,呃,我们把所有有个 api 的 这个就是一个入口了, 所有控制器的定义都都在这里定义,我们所有模块都在那个里面,包括 ev 啊, enterprise 的 这个就是核心的模块都在这里。然后 shop 是 一个 h 五端的一个, 呃,商店来管理的一个部分的内容,那个了解就行了。通过这种引入,引用了各个模块之后呢?把它那个 api 的 抛出来,这个 api 抛出来,通过这个方式来进行一个公布包,包括它的前缀,包括它的一个 tag 的, 比如说标签,其实这个就类似于我们这个是 tag, 这个是它的 前缀,是为了减减少重写的一个部分。同同样的东西嘛?因为它前缀不是都有 api 跟 control 这个东西嘛,是吧? api 什么?这个这里有个 polyface, 然后这里面可能有其他的增删改查的这个就是,呃,有有,就这个啊,我们看那个标准的吧, 就是这这边是前缀嘛?后面这个增加的那个它是个 name, 所以 很多接口的名称都是这么组装起来的 啊。通过我们通过看这里面所有把所有模块都是集中在这里啊,相当于一个门面的一个公布信息的一样,就是同同统一的入口, 然后呢这里他通过这个方式来公布,那我们每个接口我们就自己在里面定义了,我们讲我们找到刚才那个客户信息的那个啊, 啊,开始他们这个录的,你看每个业务类一个录的,你跟定的他,他也是定一个,这个就是对这个 app, 你 知道这个很简单的一个哈,这个就是,呃,我们定义的一些对象啊,这这个就是定义了一些常用的接口,就是我们自定义接口,不叫常用接口,就是我们可能在 啊鸡类提供的一些控制器接口之外提供的一些自定义的接口。那我们在这里定义也可以通过重写,有两种方式,一种是通过重写鸡类的,呃控制器的方式再重写。还有一种直接就把刚才的那个撸特传进来,相当于在这个基础上把它增加进去。 这里我们可以看看那个 user 这个优,这个是其中常见的一种方式,因为这种方式就相当于扁平化一点,就不需要重写已有控制器的函数,我们只增加额外增加的一些函数 啊,你看我们 user 里面就不一样, user 里面它就是我,我因为我可能要对 get 一个它积累的方法可能进行重写,那我就是重新在这里面做了一些定义,呃,做了一些,呃重写这个函数 啊,就像我们这个,原来它这个控制器已经有过 get 方式,我们重写了这个 get 方式,那我们就用这个方式来重写刚才那种 custom 的 方式,它那个就不一样,就是类似于我们,呃这种额外增加的接口嘛,这种是另外一种方式 啊,这就是我们回到这里来,就首先刚才讲的这整个界面,它的模,呃就项目的一个目录,它是 啊按功能来进行区分的,大家了解一下,其实我们刚才讲了主要是在 app 这个目录里面,然后有几个多这样的一个东西,刚才讲了一个括啊, api 一个, 等一下这 api 一个 cool 的, 那我们还有个 model 跟 skimmer, 我 们大概也这里再说一下,呃, api 啊, cool, 就是 我们跟那个配置文件呐,以及一些注册主要的启动的一个模块逻辑在这里面,呃,异常的处理在这里,我们大概 就像那一个 app 启动的时候,它会主核心的东西都在这里啊,酷路的,就是我们刚才讲了,就是,呃众生改查的接口,我们都都封装在这里了,呃,就相当于,呃有简单的话,可能就是 重写一下啊,这个排序的函数啊,啊,增加一个自定义的接口就可以进行一个重写,重啊,这就是标准的一个简单的一个继承类的处理,这个 如果是比较多的接口,我们在这里增加就可以了。例如我们看一下 user 里面就比较复杂的,因为这里面会增加了很多自定义的接口,所以你这里看到这里会重写很多函数,以及增加了一些额外的自定义函数啊,这就是我们做的库存啊。 呃,还有个 db, 我 们就 db 就是 对数据库我们这个积累有,呃积累做做一些啊,数据库的一个 base model 啊,做一个,呃定义就是做了一个 id 的 通用的一个一个标准啊,还有一个对芒果 db 啊,或者对对我们的 呃这个 base 就 筛选就每个对话的绘画做一些处理,这个就是我们对啊数据库操作的一个核心类了,大家了解就行。 image 是 一个图片,我们也没怎么用到图片后端,所以大家就不用说 mid view, 就是 我们做了一个进行一个处理的一个 中间键,可以看到有很多个 case incense, 就是 我们对大小写做的一个中间键,我可以希望把它转为小写统一做处理,然后访问,对访问进行一个授权处理啊,还有对对令牌的一个处理,是吧? 还有对操作日期进行一个处理,都可以独立做很多不同的一个 mid view 来处理它像那一个链条,一个一一步长一步一步长一步,可能就是一种链条式的一个中间链。 model 就是 我们定义每个数据库的一个映色的一个 操作的一个核心的类了,没有这个东西 o i m 就 没法工作。你看我们 model 这个 custom 是 最简单的一个表了,它就包含几个字段而已,这里你就看一下它里它这个代码是通过,呃,开始是手写,后来是全部是代,通过代码生成工具的方式来生成,基本上就一一匹配的, 然后这个是代表他的名称,表名称后面是质段的音色关系,以及就是通过这个音色色这个呃斯科 elk 米的这个定义的模式,我们就把它 跟这个对象跟数据库之间的表来进行一一的一个对应关系。这样子有了这个层关系,我们就可以操作他的一个模型,包括我们增删改查以及附加的查询都可以做到。 好,我们再回到这个 model 层,在顶上跟前端对接 api 接口对接的那些,就是呃那个 skims, 也叫 dto 对 象, 就是传输对象,或者说一些处理利用我们向服务端传送一些参数,可能就在这里把它解析成这个 dto 对 象。有这个概念是有什么用呢?它是可以对进,它就是基于 python 的 进行数据的一个,你看这个我们是我们自定义的一类, 就是进行一个就 base model, 就 padenta 的 一个类,就是我们强制约定这个数据的格式以及它的呃相关的一个配置属性的一个信息,有了这信息它就是一个很 呃,就是强微型,或者说对这个数数据质段呃属性进行一个约束的一个一个非常好的一个模型了,就相当于也同时把那个参数转化成对象,这样我们在后端操作的时候会更加方便。嗯, 这就是 d t o 对 象的,包括我们每个 d t o 对 象,它有哪些呢?包括我们常见的可能啊,增加修改啊,这个 常见的一个对象,以及分页的时候用到的一个分页条件的对象。这样子我们它也是继承了一个很多常见的,包括跳过哪个最大的,然后排序或者是排除的,是有增加了一些常规的条件在里面 啊,这就叫 skim 对 象。呃,这里这个,我们就这个就是是 skikla 的 一个数据库。呃,这个 static 就是 我们类似于静态文件了,有可以通过能够反文的 templar, 就是 我们刚才讲定义的一个模板, email 的 一个模板,了解就行了。 test 就是 我们做做了一个测试的一个一个类,一些类方面我们做一些,呃,代码片段的测试验证啊,这种你又不想丢掉或者说什么的,就归类管理一下啊。这里 这个里面这个目录也是个 static 一个类,因为这个是在启动的时候,这样启动话我们就可以访问作为一个静态目录来访问了,这个路径可以指向这里,那就可以通过呃,定定位到这里的话就知道它是做静态文件了,我们存储,呃,上传的文件, 呃,附件的图片啊,这些东西就直接统一放在这里啊。 youtube 就是 一些辅助类啊,反正我们 有时候会收集很多常见的一类,或者有时候为了项目的简化,我们会把一些常用的或者说重复用的接口把它抽象到这个静态类里面去啊,这方便一点。其他文件刚才讲的 main 就是 我们入口了,这个第一章就开始讲了是吧? 呃,这个设备也是他我们定义的,为了做了一些包装啊,没,不管了,这个是那个做的,那个 socket 的 那个操作的。不管了, 就主要记着这个妹里面是同一的入口,他包括我们的 dog 为什么会一打开就有,他就是个从定向到这个 dog 的 一个目录,这里面也是 好,有了这些信息呢,我们就大概知道整个项目的一个布局啊,以及他的层次,目录层次,了解了这些信息,我们就基本上对整个项目有个大观,大大的直观的了解啊。 还有讲刚才讲的这个是个 alchemy 的 dto 对 象跟实际之间啊,不,这个不是 dto, 这个整个 a p 啊,发射 api 之间的一些控制器, 就跟我们常见的呃 csup 里面的控制器里面对应的一个关系,一般我们在 csup 里面可能用 control, 或者或者在呃 java 里面也类似吧,就是对应着 api 这个这个东东西,我们统一的一个公布接口的一个地方, d t o 对 象就是这里都对应着 skimmer, 然后业务这个 service 层,因为我们这个 p s 框架,有些框架里面做了一个 service 层,就是为了做调度啊,就把一些接口啊统一封装成一个接口层 service 层, 这样子的话可以重用一些 cool 的 操作,也是屏蔽一些逻辑,当然我们呃就减减少了这层,把这层有一些逻辑放到那个 api 那 个,呃就呃设备层那里进行一个定义, 就就就 control 了那个里面进行定义啊,这里面呃有个数据访问的 dio 啊,这个里就是放在库的目录里面去这个模型或者 entity 里面对应的这个 model 目录,这也是我们呃为了 跟常见的其他的语言开发做一个对比。好,目录层次刚才也讲的很清楚了,整个这个是它项目的一个截图,呃,这个也已经讲了,我们就不再重复啊。 呃,目录层次里面有一些独立的文件,我们也要说一下刚才讲的 mac 入口文件是非常重要的一个入口,呃,很多时候从了解就是从这里开始,呃,这里有个配置文件,就是用,呃,就这个叫这个发起 api 启动的一个配置文件包周,包括我日记的一个记录啊,以及相关的一个 数据,我们就是在这里面,他其实就是为了呃在 log 日记里做了一些配置信息啊,以及我们啊格式啊这些东西做了一个定义,包括我们输出日记的时候他的级别什么相当于就是一个服务端的一个呃,配置文件吧, 除了我们那个到 e m v e m v 的 一个配置文件,这个就是我们所需要的服务的一个统一的一个设置啊,有了这些信息我们输出录制可以统一格式啊,以及一些 相关的限定,这样的。好,这里你跟他讲环境变量,由于我们存储一些敏感的信息呢,我们不可以到处应变吧,否则的话还不容易修改之外,还容易暴露秘密,是吧?数据库的连接统一存储,那修改一下就可以重启了,那就更新就没问题 啊。 redmail 是 我们项目的一些啊,就为了方便了解项目啊,对它进行一个总体的一个介绍,以及各个步骤的一些信息的一个展示啊,这个就是依赖文件。我们前面也讲了, 这个就是我们项目打包用的一个文件,这个文件可能一开始这个 spc 吧, 这个项目文件可能一开始不了解,但是你在不了解的时候你可以看看一下,参考一下。我们来看一下这个文件的一个格式,这个文件就是 python store 的, 为了做呃,打包部署的时候我们用到的这个是在哎, 在哪里啊?就这个我已经写好了,因为我我这个也测试过了啊,这个提示都没关系的啊。这个已经测试了,我们打包也可以部署到服务端去。 呃,大概讲一讲这个大概的意思吧,这个里面对不同的数据库啊,不同的平台做了一些。呃文件的一个图标,因为他打包成 es 一 的时候有些直接打 es 二,他会带有一个图标的, 所以这里会指定一个图标啊,这里可能做了一些常用的一个引入,没什么的,这里他有定义有几部分,这个几部分呢?就是一个在做一个分析的一个部分,这部分呢主要是入口啊,以及这些 一些相关的我们这个数据的。因为我们这个地方呢额外打包的目录,它就是我们要把这个文件单独的打包出来,到时候 利用我们的 e m v 可能要单独修改,你如果不公布这些的话,它可能就把整个有些要打包啊或者什么的放在一个文件不同的目录上,那你修改起来就不好弄。 所以我们这些文件都是要单独放在一个指定的目录给他,这样子的话他就是我们的上传的文件啊,放在这里哈,是吧?这样子他的独立的一个目录,这样子,还有还有这个配置文件,我们也就可以随时的进行一个修改, 特别是我们在打包成一体化的话,那这个目录他他相当于他就会单独出来, 好,包括他这里面有一些引用,我们可能依赖文件,我们会在这里要他让他加来加进来,我们怕有时候漏了他就启动不起来,或者有错,那我们有时候发现有错的话,你就把它加进来就可以了。 这里大概有文件了解,然后这个部分就照写,然后呢?还有这部分 e s e 制作打包的时候可以做一些相关的一个存储,例如我们如果是 指定一个 es 文件,那可能这里就一个处,那如果我们是松散打包呢?这里就是 force, force 它带它除了一个 es 之外,它还会带上一些依赖的库,把它弄到。呃,散松散文件的格式啊,这个时候最终的一个处理的一个 行行,我们到时候通过拍拍一嗦了的命令的翻译的方式就可以直接把它啊打包了。这个到时候你可以我们可以按照这个文件来操作一下就行了。就我这里有,我看一下这里有没有解说明打包的 打包其实很简单,但是这个命令的话可就是这个格式化就了解起来就需要花一点点时间啊,都可以说一下。呃,翻译说的就是我们打包用的好,我们 这里呃就大概讲啊,讲一下这里啊啊,后面我们再讲一个章节好了。