FastAPI(5)- 查詢參數 Query Parameters


什么是查詢參數?

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM