FastAPI(6)- get 請求 – 詳解 Query
- 2021 年 9 月 18 日
- 筆記
- FastAPI, 測試高級進階技能系列 - FastAPI
可選參數
上一篇文章講過查詢參數可以不是必傳的,可以是可選參數
from fastapi import FastAPI from typing import Optional import uvicorn app = FastAPI() # 必傳參數+可選參數 @app.get("/items") async def read_item(item_id: str, name: Optional[str] = None): return {"item_id": item_id, "name": name} if __name__ == "__main__": uvicorn.run(app="4_get_valiation:app", host="127.0.0.1", port=8080, debug=True, reload=True)
postman 請求結果
可選其實也是一種校驗
Query
為了對查詢參數進行額外的校驗,可以導入 Query 庫
Query 支持多種校驗
可選參數有默認值+長度最大為 10
# 需要先導入 Query 庫 from fastapi import Query @app.get("/itmes/") async def read_items(name: Optional[str] = Query(default=None, max_length=10)): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if name: results.update({"name": name}) return results
不傳 name 的請求結果
傳了 name,校驗成功的請求結果
name 長度大於 10,校驗失敗的請求結果
友好的錯誤提示啊!!直接說清楚哪個字段長度不滿足了…
name: Optional[str] = Query(None) 等價於
name: Optional[str] = None
Optional 的作用
為了讓 IDE 更好的支持智能提示
一個參數多個校驗
# 多條校驗 @app.get("/items/twice") async def read_items(name: Optional[str] = Query(default=None, min_length=3, max_length=10)): return {"name": name}
校驗成功的請求結果
name 長度小於 3,校驗失敗的請求結果
添加正則表達式校驗
# 正則表達式 @app.get("/items/regular") async def read_items( name: Optional[str] = Query( default=None, min_length=3, max_length=10, regex="^小.*菠蘿$" )): return {"name": name}
校驗成功的請求結果
name 不滿足正則,校驗失敗的請求結果
查看 Swagger API 文檔
正則表達式教程
//www.cnblogs.com/poloyy/category/1796055.html
必傳參數+長度最小為 3
不使用 Query 時,查詢參數怎麼必傳?
不指定默認值就行
name: str
當使用 Query 時,查詢參數怎麼必傳?
Query 默認值參數 default 是必傳的,傳了默認值不就變成可選參數了嗎,那怎麼辦呢?
# 必傳參數 @app.get("/items/require") async def read_items(name: Optional[str] = Query(default=..., max_length=10)): return {"name": name}
只需要將 … 賦值給 default 參數,FastAPI 就會知道這個參數是必傳的
校驗成功的請求結果
沒有傳必傳參數,校驗失敗的請求結果
因為是必傳參數,不傳則報錯!
查看 Swagger API 文檔
大大的 required 標識!代表必傳哦!
List 類型的查詢參數
使用 Query 時,可以指定查詢參數的類型為 List,即一個參數可以接收多個值
from typing import List # List[str] @app.get("/list") async def read_item(address: Optional[List[str]] = Query([], max_length=2)): return {"address": address}
沒有傳參的請求結果
取 address 默認值 []
正確傳參的請求結果
設置了校驗 max_length=2,但傳了三個 address 也正常,證明這個 max_length 的校驗對數組長度並不生效
校驗失敗的請求結果
看來 max_length 校驗仍然會對數組裏面的字符串生效!
查看 Swagger API 文檔
List 類型的查詢參數有多個默認值
@app.get("/list/default") async def read_item(address: Optional[List[str]] = Query(["廣州", "深圳"])): return {"address": address}
不傳參的請求結果
元數據
Query 可以添加元數據相關信息,這些信息將包含在生成的 OpenAPI 中,並由文檔用戶界面和外部工具使用
四種元數據參數
# 別名 alias: Optional[str] = None # 標題 title: Optional[str] = None # 描述 description: Optional[str] = None # 是否棄用 deprecated: Optional[bool] = None
實際代碼
# 元數據 @app.get("/items/all") async def read_items( name: Optional[str] = Query( default=None, min_length=2, max_length=50, regex="^菠蘿$", alias="name_alias_query", title="標題", description="很長很長的描述", deprecated=True, ) ): return {"name": name}
不使用 alias 進行傳參的請求結果
當做不存在的查詢參數處理
用 alias 進行傳參的請求結果
定義了 alias,記得要用 alias 進行傳參
查看 Swagger API 文檔
唯獨沒看到 title 去哪了,估計 title 字段是無用的
總結
限定於字符串的校驗:
- min_length
- max_length
- regex
Path
除了可以給查詢參數添加額外的校驗,也可以給路徑參數添加額外的校驗
Path 的具體教程://www.cnblogs.com/poloyy/p/15308131.html