什么是查詢參數?
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
