一、基本使用
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, ): ... ...
可以看到里面的驗證參數很全,除了常用的一些,另外還可以通過正則進行驗證。