FastAPI框架入门
介绍
- 快速:非常高的性能、异步框架,看齐的NodeJS和Go(感谢Starlette和Pydantic)。现有最快的Python框架之一。
- 快速编码:将功能开发速度提高约200%至300%。
- 自动:不需要开发人员去校对数据类型
- 健壮:获取可用于生产的代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。
安装
环境: Python3.7.7,Windows10
pip install fastapi uvicorn # fastapi以及启动用
pip install aiofiles jinja2 # 配置使用静态文件和模板文件需要
pip install python-multipart # form表单数据需要
- 如果pip install fastapi[all] 会安装所有模块,不建议使用
入门
from fastapi import FastAPI
app = FastAPI()
@app.get("/") # 监听GET请求
async def read_root():
return {
"Hello": "World"} # 返回json
然后运行即可,默认端口是8000,reload即Debug模式开
端口运行
uvicorn main:app --reload
也可以在main.py里加上这段代码,然后python main.py运行
import uvicorn
if __name__ == '__main__':
uvicorn.run('main:app', reload=True,
host='0.0.0.0', port=8000)
swagger 可交互api文档
- 打开127.0.0.1:8000/docs 即可,可交互api文档
redoc
- 127.0.0.1:8000/redoc, 接口文档
传参
get传参
- get请求时,参数通常在url拼接参数和query方式
- 举例:http://127.0.0.1:8000/user/10?mod=login
@app.get("/user/{user_id}")
async def user_mod(user_id: int, mod: str = None): # str = None 代表mod参数可以为空
return {
"user_id": user_id,
"mod": mod
}
json和form表单传参
- form-data方式时需要pip安装python-multipart
- 可以使用我们可以采用 application/json 的方式传参, 并且定义一个参数类来管控参数
from fastapi import FastAPI
from fastapi import Form
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel): # 定义一个类用作参数
name: str
price: float
is_offer: bool = None # 该字段可为空
@api.post("/{item_id}")
async def get_item(item_id: int = 1, item: Item, form_param: str = Form(...)): # item需要与Item对象定义保持一致
# Form(...)代表必填
return {
"item_name": item.name,
"item_id": item_id,
'form_param': form_param # 这是form参数
}
接口文档界面可以查看参数并进行测试
使用枚举限定参数
from enum import Enum
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
@app.get("/model/{model_name}")
async def get_model(model_name: ModelName): # 限定参数必须是ModelName枚举中的
pass
return model_name
URL传递路径参数
- 有时候需要传递路径参数给后端,例如 http://127.0.0.1:8000/files//home/johndoe/myfile.txt
- 这样file_path收到的内容为‘/home/johndoe/myfile.txt’
@app.get("/files/{file_path:path}")
async def read_file(file