额外的校验¶
我们打算添加约束条件:即使 q
是可选的,但只要提供了该参数,则该参数值不能超过50个字符的长度。
导入 Query
¶
为此,首先从 fastapi
导入 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
作为默认值¶
现在,将 Query
用作查询参数的默认值,并将它的 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, max_length=50)): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results
但是 Query
显式地将其声明为查询参数。
然后,我们可以将更多的参数传递给 Query
。在本例中,适用于字符串的 max_length
参数:
q: str = Query(None, max_length=50)
将会校验数据,在数据无效时展示清晰的错误信息,并在 OpenAPI 模式的路径操作中记录该参数。
添加正则表达式¶
你可以定义一个参数值必须匹配的正则表达式:
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
的第一个参数传入 None
用作查询参数的默认值,以同样的方式你也可以传递其他默认值。
from fastapi import FastAPI, Query app = FastAPI() @app.get("/items/") async def read_items(q: str = Query("fixedquery", min_length=3)): 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
声明更多元数据
你可以添加 title
:
以及 description
:
from typing import Optional from fastapi import FastAPI, Query app = FastAPI() @app.get("/items/") async def read_items( q: Optional[str] = Query( None, title="Query string", description="Query string for the items to search in the database that have a good match", min_length=3, ) ): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results