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
多级路由处理
类似于 Flask 的蓝图, FastApi 有更为简单的写法
这里以我们的项目为例, 我们有多层, 最顶级的 app 在 app 文件夹的 main.py 中, files 相关的 api 在 app > api > routers > files > api.py
中
我们从最里层的 api.py 看起, 最里层的 app > api > routers > files > api.py
大致是这样的
在 FastApi 中, 多层路由的每一层都可以设置生成一个 APIRouter 对象
我们再看上一层, 也就是 app > api > routers > api.py
这个 api.py 作为 routers 的整个的 router, 同样生成了 APIRouter 对象, 但是该对象因为并不是最下层的路由, 所以导入下层路由的 router 通过 router.include_router
注册到这个上层路由中, prefix 是路由前缀
我们再看 app > main.py
在最外层, 我们就生成了需要使用 uvicorn
启动的 app 对象, app 对象可以直接使用 include_router 注册路由, 那么其实结构是 最底层的 router 直接面向逻辑, 而外层的一层都通过 include_router 注册他, 同时在注册时可以设置前缀等操作
启动与结束事件
有时候, 我们希望在服务启动时进行一些操作, 比如初始化数据库连接池等操作, 原来我们可能是直接写在生成 app 的时候, 而在服务关闭时关闭连接池则需要费些心思, FastApi提供了事件, 我们注册到某个事件后其在指定的时候执行我们注册的功能, 还拿 main.py 举例
add_event_handler 代表添加事件, 参数1为事件的名字, 默认的有一些, 比如 startup, 参数二则是传入我们自写的函数逻辑, 注意接收一个参数为 app 对象
webSocket状态捕捉
FastApi 同样支持 webSocket, 其官方给的例子类似
其实这种如果客户端主动断开的话, 因服务端是 while 1
, 还在尝试从一个已经关闭的wb里获取数据, 所以会报错, 体现在接口里就是500, 所以我们需要捕捉此异常
依赖注入
我们知道, 在 Flask 中有一个 g 对象, 他穿插在 Flask 的生命周期中, 我们可以给某些接口使用装饰器来做一些通用的操作, 然后将数据依附在 g 中传递给具体的逻辑中方便使用, 那么在 FastApi 中也可以做到, 例如
我们在接收参数时, 可以指定某个参数是由 Depends
传出, 这便意味着这个参数不是由请求传递的, 而是由我们指定的逻辑生成后传入的, 比如上面的代码, 我们接受参数 fs, 这个参数 fs 是 Depends
生成的, 那么此参数就是这个接口的 依赖, 请求进入时会执行 Depends
包裹的函数, 也就是 get_bucket
函数, 此函数是我们自己写的, 目的是将数据库连接生成, 然后作为参数 fs 传入具体逻辑, 在里面使用
后台任务
比如我们有一个接口, 这个接口需要向某个邮箱发送邮件, 因为发送邮件这个动作可能持续几秒, 我们不能让这个请求在这边夯住直到发送完成, 我们希望理想的效果是: 接口立即返回任务提交成功,由后台发送邮件, FastApi 的 background tasks
可以帮我们做到
如上图, 我们在接收参数时加上一个 BackgroundTasks
类型的参数, 这个参数并不是由请求传递, 当我们希望将某个逻辑放到背后去执行时, 只需要 .add_task
即可, 他接受多个参数, 参数1为要执行的函数名, 后面是该函数的参数, 既可以使用顺序传参也可使用关键字传参
当我们注册后, FastApi 只是将其加入了 BackgroundTasks
中, 并不会立即执行, 而是在这个请求响应后才执行, 也就是在 return 后
FastApi 进阶的更多相关文章
- fastapi教程进阶
一个简单的栗子 from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return ...
- FastAPI实践项目:SayHello(FastAPI + vue.js + axios + element ui)
目录 简介 翻版 VS 本尊 后端服务 源码 接下来 简介 这次带来的是FastAPI + vue.js + axios + element ui (一个html文件里使用的) 实现的<Flas ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- nodejs进阶(5)—接收请求参数
1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
随机推荐
- 谈谈 javascript的 call 和 apply用法
定义: ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来),call和apply,这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值 ...
- python web的一些常见技术面试笔试题
1. 三次握手四次挥手 tcp建立连接的过程是三次挥手,断开连接是4次挥手. 三次握手:建立连接时 a. 客户端发送syn=1 seq=k给服务器 b. 服务器接收到之后知道有客户端想建立连接, ...
- 【题解】「UVA681」Convex Hull Finding
更改了一下程序的错误. Translation 找出凸包,然后逆时针输出每个点,测试数据中没有相邻的边是共线的.多测. Solution 首先推销一下作者的笔记 由此进入>>> ( ...
- GYM100526I Interesting Integers
题目大意 定义一种 \(Gabonacci\) 数列: \[\begin{array}{c} G_1=a\\ G_2=b\\ G_i=G_{i-1}+G_{i-2} \end{array} \] 给定 ...
- Java并发编程的艺术(七)——线程间的通信
为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...
- 【Python】 requests 各种参数请求的方式
Python使用requests发送post请求 1.我们使用postman进行接口测试的时候,发现POST请求方式的编码有3种,具体的编码方式如下: A:application/x-www-form ...
- proxySQL with MGR
环境信息 hostname IP port role comm ms81 192.168.188.81 3399 master ms82 192.168.188.82 3399 slave ms83 ...
- f12 Network的解析
Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板.Timeline面板.Profiles面板.Application面板.Sec ...
- kali 开启Mysql设置远程连接管理
环境工具 kali2020.01 192.168.177.137 windows10物理机heidiSQL工具下载地址 https://www.heidisql.com/download.php 开启 ...
- App性能测试揭秘(Android篇)
阿里云 云原生应用研发平台EMAS 李嘉华(千瞬) 简介: 性能测试在移动测试领域一直是一个大难题,它最直观的表现是用户在前台使用 App 时的主观体验,然而决定体验优劣的背后,涉及到了许许多多的技术 ...