写在前面
FastApi是python的异步Web框架,具有和Go,NodeJs相当的性能,总而言之,很快。当然还有一些相比于其他Web框架的优势,例如支持了Swagger文档,增加Python3.6+的数据类型指示功能,基于Pydantic的数据类型校验等等。个人觉得有学一学必要,所在这写下自己的学习记录。
安装
pip install fastapi
pip install uvicorn
其中uvicorn是一个ASGI(异步网关协议接口)服务器,介于网络协议和Python应用之间的标准接口,而Flask框架使用的是WSGI(Web服务器网关协议接口)。
HelloWorld
新建一个main.py,在其中创建一个最简单的应用
from fastapi import FastAPI
app = FastAPI() # 创建应用实例,uvicorn启动时也基于这个实例
@app.get("/") # 定义了一个"/"根目录的路由,直接返回了一个字符串
def hello_world():
return "Hello World"
应用的启动方式有两种,一种是通过命令行的方式启动
uvicorn main:app
另一种是在main.py内部实现应用的启动
import uvicorn
if __name__ == "__main__":
uvicorn.run("main:app")
'''或者使用uvicorn.run(app) 传入fastapi的实例,但是这种情况下不允许设置reload和workers参数'''
uvicorn启动参数(应用内启动)
参数 | 说明 | 参数类型 | 默认值 |
---|---|---|---|
host | 绑定的IP地址 | String | 127.0.0.1 |
port | 绑定的端口 | Integer | 8000 |
reload | 是否自动重启,开发阶段适用 | Bool | False |
reload_dir | 自定义重启的目录 | Text | None |
workers | 工作进程数,当设置reload时,该参数不生效 | Integer | 1 |
log_level | 日志级别 | Text | info |
access_log | 是否输出访问日志 | Bool | True |
debug | debug模式,开启后会自动重启服务 | Bool | False |
proxy_headers | 允许X-Forward-* | Bool | True |
forwarded_allow_ips | 以逗号分割的IP列表,来自与这些IP的代理头被新人 | Text | 127.0.0.1 |
root_path | (可选)指定应用所在的路径 | Text | None |
limit_concurency | 并发限制 | Integer | None不限制 |
limit_max_requests | 到达进程前的最大连接数 | Integer | None不限制 |
backlog | 积压的最大连接数 | Integer | 2048 |
timeout_keep_live | 超过多长时间自动关闭Keep-Alive连接 | Integer | 5 |
headers | 自定义响应头 | List | 形如[(a, b)] |
获取API文档
访问绑定的127.0.0.1:8000/doc 获取SwaggerUI风格的API文档
访问绑定的127.0.0.1:8000/redoc 获取ReDoc庚哥的API文档
接口方法简介
@app.get("/") # 定义了一个"/"根目录的路由,直接返回了一个字符串
def hello_world():
return "Hello World"
其中app是FastApi的一个实例,在上文定义的。
get是http协议的方法,除了GET,还包括POST,PUT,DELETE等方法。一般情况下,GET用于获取数据,POST用于创建数据,PUT用于更新数据,DELETE用于删除数据。当然了,也可以根据自己的习惯,使用不同的办法。
"/"是定义的路由,当服务器进行访问时,只有匹配上该路由,才能映射到对应的接口函数。
hello_world是定义的接口函数,用于实现具体的操作。FastApi是一个异步框架,所以接口函数也可以定义成以下方式
@app.get("/") # 定义了一个"/"根目录的路由,直接返回了一个字符串
async def hello_world():
return "Hello World"
官方文档中对于选择def还是async def也做了一个简单的说明
1.如果使用的第三方库告诉你调用的时候用await somefunc()的方式,使用async def
2.如果使用的第三方库与数据库,API等有交互时,并且不支持await调用方式,就使用def
3.如果不与其他交互和等待其他的响应,使用async def
4.如果你什么都不知道,使用def
不管在那种情况下,FastApi都会以异步的方式来提高效率,但是根据不同的情况选择合适的方式有助于性能优化。