可選引數
上一篇文章講過查詢引數可以不是必傳的,可以是可選引數
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 文件
正則表示式教程
https://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 的具體教程:https://www.cnblogs.com/poloyy/p/15308131.html