可選引數

上一篇文章講過查詢引數可以不是必傳的,可以是可選引數

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