FastAPI(7)- 詳解 Path
- 2021 年 9 月 19 日
- 筆記
- FastAPI, 測試高級進階技能系列 - FastAPI
前言
- 上一篇講了可以為查詢參數添加額外的校驗和元數據,Query 庫://www.cnblogs.com/poloyy/p/15306809.html
- 這篇講可以為路徑查詢添加額外的校驗和元數據,Path 庫
Path
可以為路徑參數添加額外的校驗和元數據,跟 Query 的參數是一毛一樣的
元數據
Path 也可以添加元數據相關資訊,這些資訊將包含在生成的 OpenAPI 中,並由文檔用戶介面和外部工具使用
四種元數據參數
# 別名 alias: Optional[str] = None # 標題 title: Optional[str] = None # 描述 description: Optional[str] = None # 是否棄用 deprecated: Optional[bool] = None
實際程式碼
from fastapi import FastAPI, Path from typing import Optional import uvicorn app = FastAPI() # 元數據 @app.get("/items/{item_id}") async def read_items( item_id: Optional[str] = Path( default=..., min_length=2, max_length=50, regex="^菠蘿$", title="標題", description="很長很長的描述", deprecated=True, ) ): return {"item_id": item_id}
校驗成功的請求結果
校驗失敗的請求結果
查看 Swagger API 文檔
重點
- 路徑參數始終是必需的,因為它必須是路徑的一部分
- 所以,Path 的 default 參數值必須設為 …
元數據不應該使用 alias
因為路徑參數並不能通過 參數名=value 的形式來傳值,所以沒有辦法通過 alias = value 的方式給別名傳值,最終將會報錯
@app.get("/alias/{item_id}") async def read_items( item_id: Optional[str] = Path( default=..., alias="item_alias" ) ): return {"item_id": item_id}
請求結果
查看 Swagger API 文檔,並運行
直接在 Swagger API 文檔上嘗試運行也會報錯,所以路徑參數不要用別名哦!
函數參數排序問題
Python 會將 item_id: int = Path(…) 識別為默認參數,而 q: str 是位置參數,而位置參數不能在默認參數後面,所以爆紅了
解決方案
在 Python 3.8 新除了僅限關鍵字參數://www.cnblogs.com/poloyy/p/15106522.html
@app.get("/item/{item_id}") async def read_items( *, item_id: int = Path(...), name: str): return {"item_id": item_id, "name": name}
將 * 作為第一個參數,那麼 * 後面的所有參數都會當做關鍵字參數處理,即使它們沒有設置默認值(像 name)
正常傳參的請求結果
數字類型校驗
Query 和 Path 都可以添加數字校驗,Query 文章並沒有講解數字校驗,所以這裡重點講下
數字校驗參數
# 大於 gt: Optional[float] = None # 大於等於 ge: Optional[float] = None # 小於 lt: Optional[float] = None # 小於等於 le: Optional[float] = None
實際程式碼
@app.get("/number/{item_id}") async def read_items( *, item_id: int = Path(..., title="The IDsss", gt=10, le=20), name: str = None): return {"item_id": item_id, "name": name}
校驗成功的請求結果
校驗失敗的請求結果
Query 和 Path 綜合使用
@app.get("/path_query/{item_id}") async def read_items( *, item_id: int = Path(..., description="path", ge=1, lt=5, example=1), name: str, age: float = Query(..., description="query", gt=0.0, le=10)): return {"item_id": item_id, "age": age, "name": name}
正確傳參的請求結果
注意
數字校驗也可以適用於 float 類型的值
查看 Swagger API 文檔
這裡的 item_id 還加了個 example 參數,就是個示例值,所以在介面文檔中會顯示 Example
總結
- Query、Path 和後面會講到的 Form、Cookie…等等,都是公共 Param 類的子類,但實際開發中並不會直接使用 Param 類
- 所有這些子類都共享相同的額外校驗參數和元數據
Query 類
Path 類
Param 類