FastAPI源碼分析-參數校驗

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$")

  1. 將客戶端的request解析爲JSON
  2. 將request參數轉換爲相應的數據類型
  3. 校驗數據類型,如果錯誤返回提示信息
  4. 將request傳入相應方法
  5. 數據模型可以複用,並在交互式文檔內顯示
  6. 編輯器可以根據模型進行類型提示

參數使用列表時

參數爲列表時需要用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

參考資料

  1. FastAPI官網 :https://fastapi.tiangolo.com/
  2. FastAPI源碼 :https://github.com/tiangolo/fastapi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章