一、基本使用
查詢參數是什么呢?一般前台發送的請求可能是這樣的 http://127.0.0.1:8000/items/?skip=0&limit=10 那么"?"之后的就是查詢參數每個查詢參數直接通過“&”進行連接。查詢參數:
- skip:值為0
- limit:值為10
那么在FastAPI的后台就需要進行接收。
1、可選、非可選查詢參數
from fastapi import FastAPI app = FastAPI() @app.get("/query") async def page_limit(skip: int = 1, limit: int = 10): return {"skip": skip, "limit": limit}
在上述實例中聲明了兩個查詢參數的類型是int,並且都有自己的默認值,查詢參數與路徑參數不同,它不是路徑的一部分,所以是可選的。你可以通過下面的請求方式均可:
# 請求一 http://127.0.0.1:8000/query # 請求二 http://127.0.0.1:8000/query?skip=1 # limit值為空 # 請求三 http://127.0.0.1:8000/query?limit=10 # skip值為空 # 請求四 http://127.0.0.1:8000/query?skip=1&limit=10
其最終的返回結果均是:
{ "skip": 1, "limit": 10 }
當然還可以通過類型聲明來進行控制:
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/query") async def page_limit(skip: Optional[int] = 1, limit: Optional[int] = 10): return {"skip": skip, "limit": limit}
通過Optional來聲明skiip查詢參數是可選的int類型,並且默認值是1.。limit同理如此。但是這樣用就和之前沒有Optional的沒啥區別了,所以一般可以這樣使用:
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/query") async def page_limit(skip: int = 1, limit: Optional[int] = None): if limit: return {"skip": skip, "limit": limit} return {"skip": skip}
通過判斷前台是否傳遞這個參數的值,來進行返回。
在上述可選查詢參數中注意:
- 如果沒有默認值就是必選(必填)參數
- 如果有默認值就是可選(非必填)參數
- 如果只是想成為可選參數而不想給一個特定的默認值,就使用Optional並且默認值為None
2、bool類型轉換
如果聲明的查詢參數是bool類型,它們將會被自動轉換:
from fastapi import FastAPI app = FastAPI() @app.get("/query/bool/conversion") async def type_conversion(param: bool = False): return param
當訪問以下路由:
# 路由一 http://127.0.0.1:8000/query/bool/conversion?param=yes # 路由二 http://127.0.0.1:8000/query/bool/conversion?param=on # 路由三 http://127.0.0.1:8000/query/bool/conversion?param=true # 路由四 http://127.0.0.1:8000/query/bool/conversion?param=True # 路由五 http://127.0.0.1:8000/query/bool/conversion?param=1
返回值均為true。
3、路徑參數與查詢參數
上述只是單純的查詢參數,那么實際上路由中既可以有路徑參數,同時也可以有查詢參數。FastAPI可以識別它們,並且不需要特定的順序。
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/multi/params/{item_id}") async def multi_params(item_id: int, skip: int = 1, limit: Optional[int] = None): item = {"item_id":item_id,"skip":skip} if limit: item.update({"limit":limit}) return item
上述中:
- item_id 是路徑參數,是必填參數
- skip 是查詢參數,是選填參數,默認是1
- limit 是查詢參數,是選填參數,默認值是None
二、進階
同路徑參數中的Path類似,查詢參數也提供了一個Query模塊提供功能更加完善的參數校驗。
from fastapi import FastAPI from fastapi import Query from typing import List app = FastAPI() @app.get("/query/validations") def query_params_validate( value: str = Query(...,min_length=3,max_length=6,regex="^z"), values: List[str] = Query(["V1","V2"]) ): return value,values
上述中:
- value 必選參數(存在"...")
- values 非必選參數(存在默認值)
調用接口:
通過查看源碼,更多校驗參數:
class Query(Param): in_ = ParamTypes.query def __init__( self, default: Any, *, alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, gt: Optional[float] = None, ge: Optional[float] = None, lt: Optional[float] = None, le: Optional[float] = None, min_length: Optional[int] = None, max_length: Optional[int] = None, regex: Optional[str] = None, example: Any = Undefined, examples: Optional[Dict[str, Any]] = None, deprecated: Optional[bool] = None, **extra: Any, ): ... ...