路径参数
使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量"
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
def read_item(item_id):return {"item_id": item_id}
http://127.0.0.1:8000/items/foo
路径中变量名与方法中的参数名一致时,会认为这个参数是路径参数。
请求路径里面的值就是路径参数的值。比如上面请求路径items/foo。foo就是read_item()方法item_id这个路径参数的值
有类型的路径参数
使用标准的python类型标注为函数中的路径参数声明类型,为函数提供编辑器支持,包括错误检查、代码补全等
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}
数据校验
通过python类型声明,FastApi提供了数据校验
这时候再访问http://127.0.0.1:8000/items/foo会报错,提示路径参数item_id,应该是个int类型,但是使用了str类型。
数据转换
http://127.0.0.1:8000/items/3这时返回的item_id的值是int类型的3
FastAPI 通过上面的类型声明提供了对请求的自动"解析",将来自http请求中的字符串转换成了int
预设值
如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum
类型。
from enum import Enumfrom fastapi import FastAPIclass ModelName(str, Enum): # 通过继承str,API文档会知道这些枚举必须全都是string类型al = "test"re = "test11"le = "test222"app = FastAPI()@app.get("/models/{model_name}")
def get_model(model_name: ModelName): # 使用定义的枚举类创建一个带有类型标注的路径参数if model_name is ModelName.al: # 比较枚举成员return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "test222": # 获取枚举值来比较return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}
get_model()函数中model_name这个路径参数定义的类型是ModelName这个枚举类。
在请求时,使用对应枚举的值,比如models/test。但是在get_mode这个方法处理时,test会转换成对应的枚举al。