查询参数和字符串校验
直接上代码吧
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
查询参数 q 的类型为 str,默认值为 None,因此它是可选的。可以直接来自动化文档看看
额外的校验
我们打算添加约束条件:即使 q 是可选的,但只要提供了该参数,则该参数值不能超过50个字符的长度。
导入 Query
直接上代码吧
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=5)):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
此时,q依然是可选的,但是如果你填写了,并且长度大于了5,就会报错,来看效果
添加更多校验
min_length
你还可以添加 min_length 参数:
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=5, min_length=3)):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
添加正则表达式
正则表达式
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=50, min_length=3, pattern="^fixedquery$")):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
记住:正则表达式是实际开发中,几乎是最重要的验证方式,即使你需要去数据库中进行查询校验,也应该首先使用正则来校验格式之后再进行数据库查询校验
默认值
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(
q: Union[str, None] = Query(default="fixedquery", max_length=50, min_length=3, pattern="^fixedquery$")):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
打开自动化文档看看效果
发送请求
必需参数
当我们在函数的参数列表中直接写q: str
时,就已经表明这个参数是必须的了。代替:
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: str = Query(min_length=3)):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
看下效果
使用省略号(…)声明必需参数
有另一种方法可以显式的声明一个值是必需的,即将默认参数的默认值设为 … :
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: str = Query(default=..., min_length=3)):
results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
if q:
results.update({"q": q})
return results
这样也是一种方法
查询参数列表 / 多个值
直接上代码并且看效果吧
from typing import List, Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: Union[List[str]] = Query(default=...)):
query_books = {"q": q}
return query_books
具有默认值的查询参数列表 / 多个值
from typing import List, Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(q: Union[List[str]] = Query(default=['a','b'])):
query_books = {"q": q}
return query_books
添加 title以及 description:
from typing import List, Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(
q: Union[List[str]] = Query(default=['a', 'b'], title="这是read_books", description="这是一段描述")):
query_books = {"q": q}
return query_books
别名参数
假设你想要查询参数为 item-query。
像下面这样:
http://127.0.0.1:8000/items/?item-query=foobaritems
但是 item-query 不是一个有效的 Python 变量名称。
最接近的有效名称是 item_query。
但是你仍然要求它在 URL 中必须是 item-query…
这时你可以用 alias 参数声明一个别名,该别名将用于在 URL 中查找查询参数值:
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, alias="item-query")):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
弃用参数
现在假设你不再喜欢此参数。
你不得不将其保留一段时间,因为有些客户端正在使用它,但你希望文档清楚地将其展示为已弃用。
那么将参数 deprecated=True 传入 Query:
from typing import List, Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/books/")
async def read_books(
q: Union[List[str]] = Query(default=['a', 'b'], title="这是read_books", description="这是一段描述",
alias="item-query",
deprecated=True)):
query_books = {"q": q}
return query_books
TIPS
还有很多可以使用的验证,比如数字类型的验证,还需要自己去查看
- default=default,
- default_factory=default_factory,
- alias=alias,
- alias_priority=alias_priority,
- validation_alias=validation_alias,
- serialization_alias=serialization_alias,
- title=title,
- description=description,
- gt=gt,
- ge=ge,
- lt=lt,
- le=le,
- min_length=min_length,
- max_length=max_length,
- pattern=pattern,
- regex=regex,
- discriminator=discriminator,
- strict=strict,
- multiple_of=multiple_of,
- allow_inf_nan=allow_inf_nan,
- max_digits=max_digits,
- decimal_places=decimal_places,
- example=example,
- examples=examples,
- openapi_examples=openapi_examples,
- deprecated=deprecated,
- include_in_schema=include_in_schema,
- json_schema_extra=json_schema_extra,