FastAPI源碼分析-參數校驗
GET操作不能使用RequestBody,POST/PUT/DELETE/PATCH可以。
Query參數校驗
Query參數除了可以進行基本的類型校驗,如是否爲int或str外,還可以進行其他自定義校驗,但需要引入Query
設置參數是否可選及默認值
可選參數: 使用Query(None)
默認值: 使用Query(“defaultvalue”)
必填參數: 使用Query(…)
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
字符串長度限制
字符串長度限制: 使用Query(min_length=3, max_length=50)
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(None, min_length=3, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
正則匹配
使用Query(…, regex="^fixedquery$")
- 將客戶端的request解析爲JSON
- 將request參數轉換爲相應的數據類型
- 校驗數據類型,如果錯誤返回提示信息
- 將request傳入相應方法
- 數據模型可以複用,並在交互式文檔內顯示
- 編輯器可以根據模型進行類型提示
參數使用列表時
參數爲列表時需要用Query,否則會被識別爲RequestBody
from typing import List
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(None)):
query_items = {"q": q}
return query_items
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: list = Query(None)):
query_items = {"q": q}
return query_items
http://localhost:8000/items/?q=foo&q=bar 的Query參數會被解析爲
{
“q”: [
“foo”,
“bar”
]
}
可以使用以下方法設置默認值
from typing import List
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(["foo", "bar"])):
query_items = {"q": q}
return query_items
Query其他參數設置
title: 參數名
description: 參數描述
alias: 同義詞
deprecated: 當前版本是否可用
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(
q: str = Query(
None,
title="Query string",
description="Query string for the items to search in the database that have a good match",
alias="item-query",
deprecated=True,
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
Path參數校驗
Query參數的設置在Path中都可以用,只是要引入Path
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
q: str, item_id: int = Path(..., title="The ID of the item to get")
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
Path參數還可以進行數字校驗,如大於(gt)、小於(lt)、大於等於(ge)、小於等於(le)
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*,
item_id: int = Path(..., title="The ID of the item to get", gt=0, le=1000),
q: str,
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
Path參數還可以進行float校驗
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*,
item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
q: str,
size: float = Query(..., gt=0, lt=10.5)
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
參考資料
- FastAPI官網 :https://fastapi.tiangolo.com/
- FastAPI源碼 :https://github.com/tiangolo/fastapi