一、基本使用
1、基本路径参数
如下:
from fastapi import FastAPI app = FastAPI() @app.get("/item/{item_id}") async def read_item(item_id: int): return {"item_id": item_id}
上面黄色部分包含路径、操作,其中:
- /item/{item_id} 被称为路径
- get 被称为操作,表示一种HTTP的方法(比如,POST/PUT/DELETE等)
{item_id}作为路径中的参数,其值将作为参数item_id传递给函数。
在函数中标明了路径参数应该接受什么类型的参数,这种类型的声明会进行数据校验,比如输入不符合的参数值:
{ "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] }
会出现错误的提示信息,包括出错的位置信息等。
2、路径顺序
如果有多个路径时,注意它们的顺序,因为请求是按照顺序来进行匹配的,比如:
from fastapi import FastAPI app = FastAPI() @app.get("/path/parameters") def path_params_1(): return {"message":"This is path_params_1"} @app.get("/path/{parameters}") def path_params_2(parameters:str): return {"message":parameters}
上面的两个接口,如果调用第二个接口,并且传入的值为parameters,那么就会匹配到第一个接口,所以在开发中注意调整接口的顺序。
3、枚举值
显然上述的参数都是自己来进行输入的,至于输入什么接口是无从得知的,那么枚举值就是用来进行值的预设。
from fastapi import FastAPI from enum import Enum app = FastAPI() class CityName(str,Enum): Xian = "Xian china" Shanghai = "Shanghai china" @app.get("/enum/{city}") async def city_info(city:CityName): if city == CityName.Xian: return {"info":city} if city == CityName.Shanghai: return {"info":city}
上述中实现预设值:
- 定义你需要给接口的预设值的类
- 使用定义的枚举类创建类型标注的路径参数
这样交互式文档中就有预设值:
4、包含路径的路径参数
当路径参数传递的是一个路径时,FastAPI又如何解析呢?比如上传文件的路径。
from fastapi import FastAPI # 包含路径 @app.get("/file/{file_path:path}") async def read_file(file_path:str): return {"file_path":file_path}
可以通过路径转换器,在file_path这个路径参数后面通过:path来指明匹配的是任意路径。
二、进阶
上面对路径参数的校验是通过简单的类型校验,如果想进行更为复杂的校验需要用到Path 模块。
from fastapi import FastAPI from fastapi import Path app = FastAPI() @app.get("/path/{num}") def path_params_validate( num:int = Path(...,title="input your num",description="description num",ge=1,le=5 ) ): return num
路径参数是路径的一部分,所以它是必需的,通过"..."将其标记为必需参数,即使默认值给的是None依然是必需参数。可以通过查看Path方法查看传递的更多参数:
class Path(Param): in_ = ParamTypes.path def __init__( self, default: Any, *, alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, gt: Optional[float] = None, ge: Optional[float] = None, lt: Optional[float] = None, le: Optional[float] = None, min_length: Optional[int] = None, max_length: Optional[int] = None, regex: Optional[str] = None, example: Any = Undefined, examples: Optional[Dict[str, Any]] = None, deprecated: Optional[bool] = None, **extra: Any, ): ... ...
可以看到里面的验证参数很全,除了常用的一些,另外还可以通过正则进行验证。