FastAPI(6)- get 請求 – 詳解 Query

可選參數

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

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