什麼是查詢引數?

http://127.0.0.1:8000/get?name=xxx&age=18

http://127.0.0.1:8000/get?age=18&name=xxx

在 url 的 ? 後面跟著的一組或多組鍵值對,就是查詢引數

FastAPI 的查詢引數

  • 當聲明瞭不屬於路徑引數以外的其他函式引數時, FastAPI 會自動解析為查詢引數
  • 和路徑引數不同,查詢引數可以是可選非必填的,也可以具有預設值

路徑引數+請求引數的栗子

from fastapi import FastAPI
import uvicorn app = FastAPI() # 路徑引數+請求引數
@app.get("/items/{item_id}")
async def read_item(item_id: str, name: str):
return {"item_id": item_id, "name": name} if __name__ == "__main__":
uvicorn.run(app="3_get_query:app", host="127.0.0.1", port=8080, reload=True, debug=True)

正確傳參的請求結果

必傳引數+可選引數的栗子

from typing import Optional

# 必傳引數+可選引數
@app.get("/items")
async def read_item(item_id: str, name: Optional[str] = None):
return {"item_id": item_id, "name": name}

不傳 name 的請求結果

name 沒傳所以取預設值 None

查詢引數型別自動轉換

# 查詢引數型別轉換
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
     # 如果 short == False,則加多一個鍵 description
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item

short 是 True 的請求結果

short 是 False 的請求結果

指定列舉型別請求引數的栗子

from enum import Enum
from typing import Optional, List # 自定義列舉類
class ModelName(Enum):
boy = "男"
girl = "女"
unknown = "不知道" @app.get("/item_enum")
async def read_item(name: str,
sex: Optional[ModelName] = ModelName.unknown):
return {
"name": name,
"sex": sex
}

引數傳列舉值的請求結果

不傳 sex 的請求結果

不傳 sex,會取 sex 的預設值:列舉類中的 unknown 的值

查詢引數能用 List[str] 傳參嗎?

# List[str]
@app.get("/list")
async def read_item(address: List[str] = None):
return {"address": address}

postman 請求的結果

  • 即使引數值寫成陣列形式也不會傳值成功,因為查詢引數都是字串
  • 所以 ["廣州","深圳"] 其實是一個字串 str,並不是 List[str],那要怎麼才能傳陣列呢?

分開多次傳 address 可以嗎?

答案也是不行

那要怎麼做呢?

用 Query 庫! 下一篇會講到!

https://www.cnblogs.com/poloyy/p/15306809.html