Flask 是一个轻量级的可定制框架,使用 Python 语言编写,框架特点主要包括灵活、轻便、安全且容易上手。小型团队在短时间内就可以完成功能丰富的 Web 接口服务的实现。
今天它的对手 FastApi 框架来啦!FastAPI是一种现代,高性能的Web框架:
- 支持异步编码;
- 框架源码全部基于标准的 Python 3.6 类型声明;
- 100%类型注释的代码库;
- 框架也有灵活、轻便、安全的特点;
一.FastApi 如何安装
和 Flask 的安装方式一样,都是可以使用 pip 安装。直接在终端执行命令 pip install "fastapi[all]", 即可安装 FastApi 和它所需要的一些依赖。
二.Flask VS FastApi
01.代码风格对比
1).使用 Flask 开发一个简单的需求:
有这样的需求:编写一个API 接口,接收 POST 请求发送过来的数据,对参数进行处理,并返回,使用 Flask 开发接口的代码如下:
看起来似乎很简洁了,用 postman 发个请求看看效果,如图所示:
2).使用 FastApi 开发上述需求
代码风格和 Flask 很相似,都是把框架类实例化成了一个 app 对象,这个 app 作为一个装饰器使用。
02.接口健壮性对比
1).使用 postman 请求 Flask 编写的接口
请求 Flask 编写的接口时,请求参数 num 的值忘记传了,代码就会报错,例如:
为了保证接口的健壮性,必须为接口加上一些参数校验的代码,增加参数校验后代码变得复杂了。
虽然 Flask 可以让你用很少的代码写出一个可以正常运行的项目,但是写成一个可以正常使用的项目还需要你写更多的代码。
2).使用 postman 请求 FastApi 编写的接口
去掉请求参数 num ,效果是这样的,我们来看一下
FastApi 编写接口会智能的返回错误信息,提示 num 字段缺失,未传参,保证了接口的健壮性。参数校验由 FastApi 框架自己完成,不用我们再写额外的代码进行参数校验。
三.框架性能对比
网站性能对于普通用户来说,最直接的体现就是响应时间。从开发人员的角度看,网站性能的指标主要有并发数和响应时间。
FastApi 框架正如其名字一样,它是可用的最快的 Python web 框架之一。
上图的性能对比基准是基于每秒响应数,每个请求20个查询,明显看出 FastApi 接口响应速度比 Flask 快很多。
1).Flask 部署方式
由于 Flask 本身是不支持异步编码,所以它一般的部署方式和同步的框架 Django 是一样的,都是用 uwsgi 部署。
2).FastApi部署方式
FastAPI 是个异步框架,所以它是支持 async/await 异步编程语法的,比如下面这段代码:
本地和生产环境中,FastApi 都是通过 uvicorn 运行的,运行指令都是 uvicorn main:app —reload ,其中main 是脚本名称。uvicorn 一个性能非常高 的 ASGI 服务器,基于 uvloop 和 httptools 构建。
四.API接口文档对比
在项目开发中,Web 项目的前后端分离开发需要由前后端工程师共同定义接口。编写接口文档,之后大家都根据这个接口文档进行开发,同时也方便后期人员查看、维护。
Flask 框架本身并没有自带 API 文档,需要借助第三方插件实现,生成API接口文档的第三方插件还是蛮多,但是对选择困难症的朋友不是很友好。而 FastApi 框架本身自带生成交互式的 API 接口文档,对于选择困难症的朋友是很友好的,直接使用框架自带的Api交互式文档即可。
对于 FastApi 框架,访问http://127.0.0.1:8000/docs, 看到的是 swagger-ui类型的文档:
如果访问 http://127.0.0.1:8000/redoc , 看到的是redoc风格的接口文档:
5.框架现代化对比
众所周知,Python 的变量随时可以被赋值,且能赋值为不同的类型,由于不做任何类型检查,有些问题直到运行才显现出来,或者线上运行时才能暴露出问题。
而类型注释可以对函数的参数进行类型注解,也可以对函数的返回值进行类型注解。使用类型注释保证了更少的错误。
细心的同学会发现,小编在 FastApi 代码中写了一些基于标准的 Python 3.6 的类型注释声明,对一些请求参数的类型做了限定,比如:
1).Flask 框架的源码:
Flask 框架源码并没有使用现代化的类型注释声明。
2).FastApi 框架的源码:
FastApi 框架源码有 100% 类型注释的代码库,并且全部基于标准的Python 3.6 的类型声明。小编找了 FastApi 一段源码,每个请求参数和返回参数都做了类型注释的声明:
代码语言:javascript复制