FastAPI允许为参数声明附加信息与校验。

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(q: Optional[str] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

查询参数 q 的类型时 Optional[str],即它的类型是 str,但也可以是 None(其实,是它的默认值为None),q是可选参数。

 

附件校验

接下来,添加一些约束条件,即使 q 是可选的,但只要提供了该参数,该参数的长度就不能超过50个字符。

导入Query,以Query为默认值。

from typing import Optional

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, max_length=50)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

Query作为查询参数的默认值,并把max_length参数设置为50。此处使用Query(None)代替None作为默认值,Query的第一个参数也用于定义默认值。

q: Optional[str] = Query(None) 等效于 q: Optional[str] = None
这样就可以为Query传递更多参数,本例中使用max_length参数约束字符串。

q: str = Query(None, max_length=50)

这行代码会校验数据,在数据无效时显示错误。

 

添加更多校验

from typing import Optional

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Optional[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

 

添加正则表达式

FastAPI还能定义必须与正则表达式匹配的参数。

from typing import Optional

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Optional[str] = Query(None, min_length=3, max_length=50, regex="^fixedquery$")
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

 

标记为必选

使用 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

 

posted on 2022-04-28 15:18  司徒轩宇  阅读(150)  评论(0编辑  收藏  举报