上一篇文章讲过查询参数可以不是必传的,可以是可选参数
from fastapi import FastAPI
from typing import Optional
import uvicorn
app = FastAPI()
# 必传参数+可选参数
@app.get("/items")
async def read_item(item_id: str, name: Optional[str] = None):
return {"item_id": item_id, "name": name}
if __name__ == "__main__":
uvicorn.run(app="4_get_valiation:app", host="127.0.0.1", port=8080, debug=True, reload=True)
可选其实也是一种校验
为了对查询参数进行额外的校验,可以导入 Query 库
# 需要先导入 Query 库
from fastapi import Query
@app.get("/itmes/")
async def read_items(name: Optional[str] = Query(default=None, max_length=10)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if name:
results.update({"name": name})
return results
友好的错误提示啊!!直接说清楚哪个字段长度不满足了...
name: Optional[str] = None
为了让 IDE 更好的支持智能提示
# 多条校验
@app.get("/items/twice")
async def read_items(name: Optional[str] = Query(default=None, min_length=3, max_length=10)):
return {"name": name}
# 正则表达式
@app.get("/items/regular")
async def read_items(
name: Optional[str] = Query(
default=None,
min_length=3,
max_length=10,
regex="^小.*菠萝$"
)):
return {"name": name}
https://www.cnblogs.com/poloyy/category/1796055.html
不指定默认值就行
name: str
Query 默认值参数 default 是必传的,传了默认值不就变成可选参数了吗,那怎么办呢?
# 必传参数
@app.get("/items/require")
async def read_items(name: Optional[str] = Query(default=..., max_length=10)):
return {"name": name}
只需要将 ... 赋值给 default 参数,FastAPI 就会知道这个参数是必传的
因为是必传参数,不传则报错!
大大的 required 标识!代表必传哦!
使用 Query 时,可以指定查询参数的类型为 List,即一个参数可以接收多个值
from typing import List
# List[str]
@app.get("/list")
async def read_item(address: Optional[List[str]] = Query([], max_length=2)):
return {"address": address}
取 address 默认值 []
设置了校验 max_length=2,但传了三个 address 也正常,证明这个 max_length 的校验对数组长度并不生效
看来 max_length 校验仍然会对数组里面的字符串生效!
@app.get("/list/default")
async def read_item(address: Optional[List[str]] = Query(["广州", "深圳"])):
return {"address": address}
Query 可以添加元数据相关信息,这些信息将包含在生成的 OpenAPI 中,并由文档用户界面和外部工具使用
# 别名
alias: Optional[str] = None
# 标题
title: Optional[str] = None
# 描述
description: Optional[str] = None
# 是否弃用
deprecated: Optional[bool] = None
# 元数据
@app.get("/items/all")
async def read_items(
name: Optional[str] = Query(
default=None,
min_length=2,
max_length=50,
regex="^菠萝$",
alias="name_alias_query",
title="标题",
description="很长很长的描述",
deprecated=True,
)
):
return {"name": name}
当做不存在的查询参数处理
定义了 alias,记得要用 alias 进行传参
限定于字符串的校验:
除了可以给查询参数添加额外的校验,也可以给路径参数添加额外的校验
Path 的具体教程:https://cloud.tencent.com/developer/article/1883178