FastApi 进阶

摘要:
前言终于有了FastApi编写的第一个在线服务。在开发过程中仍遇到一些问题。这里我们记录主体目录结构。我们知道FastApi的启动方法建议使用uvicorn。启动方法通常是uvicormain:app。实际上,main是文件的名称,app是生成的FastApi对象。那么,对于一个相对较大的项目,我们应该如何布局项目?
前言

终于有了第一个使用 FastApi 编写的线上服务, 在开发的过程中还是遇到了些问题, 这里记录一下

正文

目录结构

我们知道, FastApi 的启动方式推荐使用 uvicorn, 其启动方式大致为 uvicorn main:app, 实际上 main 为该文件的名字, app 为生成的 FastApi 对象, 那么, 对于一个比较大的项目, 我们应该怎样去布局项目呢? 我们参考了 https://github.com/nsidnev/fastapi-realworld-example-app 他是在名为 app 的文件夹中的 main.py 文件存放最大的 app, 在 该文件夹下存放各种逻辑文件, 例如: 基础的数据库相关放在 db 文件夹中, 公共的逻辑放在 core 文件夹中, 接口相关放在 api 文件夹中等等...

因为 app 已经放置在app文件夹中的 main.py 文件中, 启动时则是在根目录输入 uvicorn app.main:app

main.py

FastApi 进阶第1张

多级路由处理

类似于 Flask 的蓝图, FastApi 有更为简单的写法

这里以我们的项目为例, 我们有多层, 最顶级的 app 在 app 文件夹的 main.py 中, files 相关的 api 在 app > api > routers > files > api.py

FastApi 进阶第2张

我们从最里层的 api.py 看起, 最里层的 app > api > routers > files > api.py 大致是这样的

FastApi 进阶第3张

在 FastApi 中, 多层路由的每一层都可以设置生成一个 APIRouter 对象

我们再看上一层, 也就是 app > api > routers > api.py

FastApi 进阶第4张

这个 api.py 作为 routers 的整个的 router, 同样生成了 APIRouter 对象, 但是该对象因为并不是最下层的路由, 所以导入下层路由的 router 通过 router.include_router 注册到这个上层路由中, prefix 是路由前缀

我们再看 app > main.py

FastApi 进阶第1张

在最外层, 我们就生成了需要使用 uvicorn 启动的 app 对象, app 对象可以直接使用 include_router 注册路由, 那么其实结构是 最底层的 router 直接面向逻辑, 而外层的一层都通过 include_router 注册他, 同时在注册时可以设置前缀等操作

启动与结束事件

有时候, 我们希望在服务启动时进行一些操作, 比如初始化数据库连接池等操作, 原来我们可能是直接写在生成 app 的时候, 而在服务关闭时关闭连接池则需要费些心思, FastApi提供了事件, 我们注册到某个事件后其在指定的时候执行我们注册的功能, 还拿 main.py 举例

FastApi 进阶第6张

add_event_handler 代表添加事件, 参数1为事件的名字, 默认的有一些, 比如 startup, 参数二则是传入我们自写的函数逻辑, 注意接收一个参数为 app 对象

FastApi 进阶第7张

webSocket状态捕捉

FastApi 同样支持 webSocket, 其官方给的例子类似

FastApi 进阶第8张

其实这种如果客户端主动断开的话, 因服务端是 while 1 , 还在尝试从一个已经关闭的wb里获取数据, 所以会报错, 体现在接口里就是500, 所以我们需要捕捉此异常

FastApi 进阶第9张

依赖注入

我们知道, 在 Flask 中有一个 g 对象, 他穿插在 Flask 的生命周期中, 我们可以给某些接口使用装饰器来做一些通用的操作, 然后将数据依附在 g 中传递给具体的逻辑中方便使用, 那么在 FastApi 中也可以做到, 例如

FastApi 进阶第10张

我们在接收参数时, 可以指定某个参数是由 Depends 传出, 这便意味着这个参数不是由请求传递的, 而是由我们指定的逻辑生成后传入的, 比如上面的代码, 我们接受参数 fs, 这个参数 fs 是 Depends 生成的, 那么此参数就是这个接口的 依赖, 请求进入时会执行 Depends 包裹的函数, 也就是 get_bucket 函数, 此函数是我们自己写的, 目的是将数据库连接生成, 然后作为参数 fs 传入具体逻辑, 在里面使用

后台任务

比如我们有一个接口, 这个接口需要向某个邮箱发送邮件, 因为发送邮件这个动作可能持续几秒, 我们不能让这个请求在这边夯住直到发送完成, 我们希望理想的效果是: 接口立即返回任务提交成功,由后台发送邮件, FastApi 的 background tasks 可以帮我们做到

FastApi 进阶第11张

如上图, 我们在接收参数时加上一个 BackgroundTasks 类型的参数, 这个参数并不是由请求传递, 当我们希望将某个逻辑放到背后去执行时, 只需要 .add_task 即可, 他接受多个参数, 参数1为要执行的函数名, 后面是该函数的参数, 既可以使用顺序传参也可使用关键字传参

当我们注册后, FastApi 只是将其加入了 BackgroundTasks 中, 并不会立即执行, 而是在这个请求响应后才执行, 也就是在 return 后

免责声明:文章转载自《FastApi 进阶》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DPDK并行计算elasticsearch 修改changeme passwd下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前后端项目对接流程梳理

  课程目标 掌握一个电商网站从设计到上线的整个过程所涉及的流程 具备独立开发一个前端项目的能力 架构设计 前后端完全分离 分层架构 模块化 技术选型 HTMl CSS JS jQery 辅助工具 Webpack NodeJs NPM Shell 效率工具 Sublime Chrome Charles Git 课程安排 //基础框架的搭建 双平台的...

国产操作系统——银河麒麟V10 SP1使用小结

前几天看新闻国产操作系统银河麒麟有了新的更新于是上手搞了一个。     ========================================================= 该系统自带驱动,其中包括NVIDIA的显卡驱动,十分神奇,不过这也造成了一个问题就是你自己不好再安装驱动了。   自己手动安装银河麒麟的NVIDIA-driver-...

Appium(七):Appium API(一) 应用操作

1. 应用操作 本章所罗列的方法主要针对应用的操作,如应用的安装、卸载、关闭、启动等。 把前面的启动代码放在这里,后面只展示不同的部分。 #coding:utf-8 from appium importwebdriverfrom time import sleep #初始化 desired_caps ={} #使用哪种移动平台 desired_caps[...

VirtualBox虚拟机下Windows登录密码破解方法(阿里云推荐码:1WFZ0V,立享9折!)

VirtualBox虚拟机下Windows登录密码破解方法 近两年虚拟机的发展给开发人员带来了极大便利,安装一个新环境,只需从别人那里copy一份虚拟机文件即可,分分钟搞定。我之前一直在Ubuntu下工 作,Windows偶尔使用,于是在Ubuntu VirtualBox下安装了一个Windows 7。今年将工作环境迁移到Mac Air下了,但偶尔也有Wi...

Iview的开发之路

采用了Vue-cli的方式。  1、反向代理 devServer: { host: '127.0.0.1', port: 9000, proxy: { '/gonghui/': { target: 'http://127.0.0.1', secure: false,...

【react+antd】前端读取本地文件内容(txt)

场景:xxx血压计测量数据之后,需要将测量的数据直接显示在pc后台管理平台相应的表格中 准备:一台xxx血压计,数据线,相关血压计桌面软件,pc 血压计相关说明:测量时,将数据线和pc连接,打开血压计桌面软件,点击连接设备,连接成功,开始测量,测量完成,桌面软件会显示相应的值:比如 收缩压 舒张压 心率 脉搏等,数据会存到本地的某个文件下,txt文本形式,...