菜鸟大叔 菜鸟学Python 2020-09-21

点击上方“菜鸟学Python”,选择“星标”公众号

超级无敌干货第一时间推给你!

终于,Flask 迎来了真正的对手!_Python

Flask 是一个轻量级的可定制框架,使用 Python 语言编写,框架特点主要包括灵活、轻便、安全且容易上手。小型团队在短时间内就可以完成功能丰富的 Web 接口服务的实现。

今天它的对手 FastApi 框架来啦!FastAPI是一种现代,高性能的Web框架:

  • 支持异步编码;

  • 框架源码全部基于标准的 Python 3.6 类型声明;

  • 100%类型注释的代码库;

  • 框架也有灵活、轻便、安全的特点;


一.FastApi 如何安装


和 Flask 的安装方式一样,都是可以使用 pip 安装。直接在终端执行命令 pip install "fastapi[all]", 即可安装 FastApi 和它所需要的一些依赖。

终于,Flask 迎来了真正的对手!_Python_02



二.Flask VS FastApi


01.代码风格对比

1).使用 Flask 开发一个简单的需求:

有这样的需求:编写一个API 接口,接收 POST 请求发送过来的数据,对参数进行处理,并返回,使用 Flask 开发接口的代码如下:

终于,Flask 迎来了真正的对手!_Python_03


看起来似乎很简洁了,用 postman 发个请求看看效果,如图所示:

终于,Flask 迎来了真正的对手!_Python_04

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风格的接口文档:

终于,Flask 迎来了真正的对手!_Python_05


5.框架现代化对比


众所周知,Python 的变量随时可以被赋值,且能赋值为不同的类型,由于不做任何类型检查,有些问题直到运行才显现出来,或者线上运行时才能暴露出问题

而类型注释可以对函数的参数进行类型注解,也可以对函数的返回值进行类型注解。使用类型注释保证了更少的错误。

细心的同学会发现,小编在 FastApi 代码中写了一些基于标准的 Python 3.6+ 的类型注释声明,对一些请求参数的类型做了限定,比如:

终于,Flask 迎来了真正的对手!_Python_06

1).Flask 框架的源码:

Flask 框架源码并没有使用现代化的类型注释声明。

终于,Flask 迎来了真正的对手!_Python_07

2).FastApi 框架的源码:

FastApi 框架源码有 100% 类型注释的代码库,并且全部基于标准的Python 3.6+ 的类型声明。小编找了 FastApi 一段源码,每个请求参数和返回参数都做了类型注释的声明:

终于,Flask 迎来了真正的对手!_Python_08


有兴趣的小伙伴,下次在做后端项目的时候,可以试试FastAPI,也许效果会让你大吃一惊哦!希望本篇的分享对大家有帮助,欢迎大家三连!