从Flask到FastApi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Flask到FastApi相关的知识,希望对你有一定的参考价值。

参考技术A

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

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

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

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

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

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

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

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

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

首先导入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 参数,为了能热更新,它需要这些信息,不然会报错:

所以,都是被逼的。

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

用sqlalchemy的同学可以跳过哦!

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

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

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

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

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

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

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

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

新版本接口:

一切的核心都在于这个 UserDto

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

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

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

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

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

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

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

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

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

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

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

以上是关于从Flask到FastApi的主要内容,如果未能解决你的问题,请参考以下文章

Flask从入门到精通

Flask 从入门到实践

从Flask到FastApi

推荐系统从入门到实战——Flask框架的使用

将变量从 Flask 传递到 JavaScript

Flask从入门到精通