从Flask到FastApi

大家好,这里是米洛,一个想和大家一起分享测试开发相关的技术,面试经验和成长经历的博主!

欢迎大家关注我的公众号: 测试开发坑货

从Flask到FastApi

上次我们已经拿到了FastApi体验卡,并且搭建了一个demo服务。说好的要开始学FastApi,那怎么能从入门到放弃呢?

所以我稍稍看了一下文档,理了一下他里面的门路。所以这篇文章可以算是私货吧,由官方文档加上个人理解组成。我打算先完善比较重要的功能,剩下的到用到的时候再切换就行了。

为了方便大家能从Flask无缝切换到FastApi,我也经过一定的实践,结合自己的项目特意编写了这篇文章,可能有些地方没有考虑到,希望大家见谅。文章有点点长,可以不用一口气看完~留着后面啃也可以!

1. 配置项目改造

我们之前会给Flask的app(pity)初始化一个配置:

image

其实配置还有一种用法,就是直接引入Config类,利用Config.字段去获取配置项,所以我们在原项目里面取配置的方法都要修改。

2. Cors跨域修改

image

Flask支持跨域很简单,引入CORS,将app套进去即可。

其实FastApi也不难,其中官网就有对应的例子:

image

通过引入FastApi自己封装好的CORSMiddleware,即可达到一样的效果。

3. 支持Debug

因为按照我们上一篇的内容,我们通过uvicorn启动了FastApi服务,但是由于我们是在终端(Terminal)运行的,所以其实打的断点是无法起作用的,所以我们需要通过运行main.py来达到调试的目的,官网也有类似的教程。

image

首先导入uvicorn库,然后通过uvicorn.run来运行对应的app,我经常提到的app,其实是一个FastApi的实例的概念。虽然我给他取名叫pity,但是我有时候也会叫他app,希望不要给大家带来困扰。

注意,我这边run方法接受了4个参数,host和port就不多说了,dddd。

reload呢,就是热更新的意思。

至于app='main:pity',main代表的是这个文件的名字: main.py,pity也就是app的名字。main:pity即代表当前要启动的是main里面的pity。

至于为什么要这么复杂,归根结底还是这个reload参数,为了能热更新,它需要这些信息,不然会报错:

image
image

所以,都是被逼的。

4. Flask-Sqlalchemy变更

其实这个不太属于这块内容,因为有的人甚至没有用到这个模块。

用sqlalchemy的同学可以跳过哦!

其实解决方法呢,就是换成sqlalchemy。所以我们需要按照sqlalchemy的格式去编写ORM。

  • 修改models/init.py
image

可以看到我这边读取链接URL,是通过Config来直接获取的。

  • 改造models/user.py

    随便以user.py为例子:

image

构造函数可不变,Use类继承的对象就是models/init.py里面的Base类,需要注意的是: sqlalchemy需要tablename这样一个字段,所以我们需要给它加上,它不会默认生成,不加就报错。其他地方基本上没有差异。

  • 改写增删改查部分
image

注册用户为例,改写方法是去掉以前的User.query.filter_by(),改为session.query(User).filter_by(),其他的时候差距不大。

注意为什么要用with,因为with执行完毕之后会自动调用exit(),也就是会自动关闭session

5. 参数校验部分

FastApi呢,和Pydantic进行了强强结合,虽然这一块我还摸得不是很清楚,不过我暂时可以用起来了。

先看下旧版本的,人肉校验器:

image

新版本的话,等于说是把参数校验和业务逻辑解耦了,参数校验放到另外的地方去编写,接口里面只负责处理业务逻辑即可。

新版本接口:

image

一切的核心都在于这个UserDto

image

可以看到,我们为UserDto类指定了4个字段,因为都是必填项,所以未加上默认值,如果我们需要email是非必填的,则要改成:

class UserDto(BaseModel):
    name: str
    password: str
    username: str
    email: str = None

接着就是具体的校验方法了,由于我们的校验规则很简单,所以对所有字段都是采取的一个方法: field_not_empty

意思是字段不能为空字符串,否则抛出ParamsError,注意这个ParamsError是我自定义的错误类型,它继承了ValueError。

image
  • 进阶

    由于我们的字段校验不通过的返回格式是这样的:

image

但是这个字段呢,是pydantic帮忙校验好的,所以我们需要添加这么一个方法:

image

这个方法是针对请求参数校验失败的处理,类似于一个hook,只有请求参数校验失败了,才会走到这个步骤。虽然里面错误信息多,但是我们只取第一条错误信息,不然数据多了展示不方便。

image

接着我们定义了一个错误字典,目前支持missing,params(自己封装的), not_allowed(参数类型不一致)

看看效果

image

这样就完成了参数的校验了!

6. 蓝图

在http请求里,接口分类是很关键的事情,所以蓝图这块我们不能跳过,我们粗略讲一下。其实flask里面我们也只是用来给url分组,那我们这里也完成一样的事情就好了。

  • 编写接口
image

APIRouter约等于Blueprint,创建一个APIRouter实例,prefix即url的前缀。

编写接口的时候从@app.route改为@router.post/get即可,变化不大。

  • 注册router

    router的注册也很简单,和之前蓝图注册类似,通过app.include_router方法即可实现:

image

由于我这里只改造了user下的router,所以其他的未include进来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271