天下武功,惟快不破。在软件开发中更是如此,“快”能从多方面提高用户体验。谈到Python,它彷佛天生就和速度无关,你可能很熟悉Django、Flask这些框架,虽然开发效率的确不错,可是速度就一言难尽。那么在先后端分离开发的时代,有没有能拿得出手的Python Web框架呢?固然是有的,FastApi它来了。html


1、为何是FastApi?
人们在介绍FastApi的时候一般会说“FastApi”是一个高性能的异步WEB框架。我相信没有哪一个程序员会跟“高性能”过不去,这每每也是咱们所追求的东西。fastapi具备并发性能强、可以快速上手、容错能力强、自动生成交互式文档的特色,这些都是咱们选择它的理由。python


2、到底有多快?
不少人介绍FastApi框架时,常常说其并发性能可以和NodeJS以及Go媲美,其实言过其实。在Go语言中文社区中梦想作小猿分别对Go、Flask、FastApi作了性能测试,迫于篇幅限制,我这里直接放结果:jquery
FastAPI:500并发 30秒:Speed=955466 pages/min, 238685 bytes/sec程序员
Flask:500并发 30秒:Speed=33706 pages/min, 96457 bytes/secweb
Go:500并发 30秒:Speed=116962 pages/min, 278740 bytes/secajax
可见Go仍是很强大的,可是fastapi已经远远超过了同为python框架的 flask。mongodb
与PHP7对比:数据库
分别用PHP七、FastAPI从mongodb数据库中取出相同的数据作成接口,相同参数获得相同的数据结果,速度以下:json
FastApi用时43.06ms:flask


PHP7 用时43.73ms:


通过屡次测试,成绩较为稳定,无需取平均值,由此看来,FastApi速度上相比于其余Python框架,是占有绝对优点的!
3、安装相关模块
FaseApi这么快,想必你已经火烧眉毛想要了解如何使用了。接下来咱们讲讲如何开始第一个FastApi项目。
安装FastApi执行 pip install fastapi
因为FastApi还须要一个ASGI服务框架 uvicorn,须要执行pip install uvicorn来安装uvicorn。
注意Linux下通常会报错以下:


Centos 执行yum install python3-devel,Ubuntu 执行sudo apt-get install python3-dev,便可解决问题,很是简单!
4、Hello, API
如今就来快速上手吧:
第一个api:
建立文件zhiliao.py,码代码:


而后在zhiliao.py文件所在目录,执行uvicorn zhiliao:app --reload
其中,zhiliao是py文件名,冒号后面的app是咱们在代码中建立的FastAPI实例,这一点相似Flask,其余参数等下会详细说到。
执行以后,获得反馈信息。


能够看到Uvicorn running on [http://127.0.0.1:8000 [0m (Press CTRL+C to quit),打开浏览器:


这样就成功的建立了第一个接口服务,每次请求的同时咱们也能可以看到,请求日志,方便调试。


获取路径参数:
接着写以下代码:


保存以后能够看到:


项目自动从新加载了,咱们无需再执行uvicorn……,缘由是咱们刚刚启动实例时,加了--reload参数,这一点相似于Flask中的debug=True,不推荐在线上环境中开启,仅为了线下调试方便。
访问浏览器:http://127.0.0.1:8000/hello/知了,能够看到:


咱们不难发现,res在程序中是一个字典,而fastapi将其自动转为了json格式,无需再使用json模块进行编码,这极大的便利了咱们的开发。
问号传参与数据类型限制:
为了防止用户填写表单时不按套路来,咱们最好对参数类型进行限制,上代码:


浏览器访问http://127.0.0.1:8000/zhiliao?name=张三&age=23:


若是改为http://127.0.0.1:8000/zhiliao?name=张三&age='23'也便是字符23,会报错,提示数据类型错误。
{"detail":[{"loc":["query","age"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
自动生成文档:
fastapi具备自动生成文档的能力:
交互文档:
访问:http://127.0.0.1:8000/docs,能够看到,上面咱们写的三个接口都已经给出了文档。


还能够继续用于测试,咱们测试一下第三个接口,填写两个值,而后点击 execute:


能够看到,给出了很是详细的反馈信息:


API文档:
咱们打开http://127.0.0.1:8000/redoc
能够看到详细的文档:


5、进阶篇:
1. 基础参数配置:
咱们使用uvicorn 配合fastapi,它是一个基于 asyncio 开发的一个轻量级高效的 Web 服务器框架。
下面一条命令演示经常使用参数:


--host是绑定的地址,127.0.0.1为本地,若是是0.0.0.0,那么意味着它将暴露在公网中,全部人均可以访问,线上环境经常使用。
--port 80表示,使用80端口做为该服务的默认端口,无需在地址后加端口号,能够直接访问 http://127.0.0.1
2. 开启 HTTPS, 给你的网站加把小锁:
鲜有人在讲fastapi时提到开启HTTPS,大人,时代变了,http早已经被谷歌浏览器标记为不安全。不过,你还别说,网站上了https 还真是好看呢。
另外,若是咱们的应用不开启https,那么将意味着只能被未开启ssl的网站调用,假设咱们主站用的是https,那么咱们必须开启HTTPS,不然会调用失败。
说了这么多,其实作起来很简单,执行uvicorn --help能够看到详细的配置文档,能够看到:


有这么三个参数,第一个是证书的key文件,第二个是crt文件,第三个不用管是默认的。
只需执行:
uvicorn zhiliao:app --host 0.0.0.0 --port 8080 --ssl-keyfile /ssl/private.key --ssl-certfile /ssl/certificate.crt
这意味着咱们的应用将会在8080端口运行,而且暴露在公网中,人们均可以访问,--ssl-keyfile参数后面跟key文件目录,--ssl-certfile,同理。能够看到,网站已经能够用https访问。


3. 配置跨域传参
既然是接口服务,那么跨域传参是必然要碰到的问题。
现有情景以下咱们的Api服务是127.0.0.0:8000,而咱们的网站主域名是127.0.0.1,
不一样端口属于不一样域,下面的介绍也适合其余跨域场景好比主站是http://www.xx.com而api服务的域名是http://api.xx.com,一样适合。
如今网站要调用api的接口,咱们用jquery的 ajax试一下:
创建一个测试文件zhiliao.html,写入以下内容并访问:


能够看到,因为是不一样域,访问失败:


加上几行代码,最终以下:


咱们刷新浏览器:


跨域传参成功,获取数据成功。
那么,介绍到这里就结束了,相信有了python+fastapi的加持,python在web领域又多了一席之地。也但愿,fastapi成为你的得力工具。