show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次我们研究了请求体
- 请求体
- 是使用POST或者PUT发送到服务器的json字典对象
- 对应一个python类
- 请求体对象也可以设置
- 数据类型
- 默认值
- 请求体发送给服务器之后
- 服务器可以进行处理
- 再返回给浏览器一个json对象
- 请求体可以配合
- 路径参数
- 查询参数
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是
- 查询参数
- 可选的
- 默认值为None
-
现在要增加验证
- 字符串不能超过50个字符
- 我们把默认值None
- 换成了Query函数
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, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- 我们仍然能设置默认值
- 用Query(default=None)
- q 的默认值是Query()函数的结果
- 说明q是一个查询参数
- 函数Query的默认参数max_length为50
- 需要验证max_length最大宽度为50
- 除了max_length
- 还可以有什么其它参数吗?
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, min_length=3, max_length=50)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- 还可以设置min_length
- q真的给个None的话
- 返回结果是字典
- 其中的字典项是列表
- 列表的列表项是字典
- 如果q是给的字符串
- 但是长度为2
- 不满足min_length呢?
- 前端验证无法通过
- 直接报错
- 可以验证字符串的模式吗?
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, min_length=3, max_length=50, regex="^fixedquery$"
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- regex="^fixedquery$"
- ^
- 以该符号之后的字符开头
- 符号之前没有字符
- fixedquery
- 值精确地等于 fixedquery
- $
- 到此结束
- 在 fixedquery 之后没有更多字符
- ^
- 不满足正则表达式要求的话
- 前端验证出问题
- 直接报错
- 不会提交到服务器
- 正确的参数可以验证成功
- 发送请求到后端服务器
- 后端服务器返回json对象
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(default="fixedquery", min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- 可以为q设置非None的默认值
- 声明默认值可以设置参数为可选
- q: str
- q: Union[str, None] = Query(default=None, min_length=3)
- 不声明默认值就可以设置参数为必填
- q: str = None
- q: str = Query(min_length=3
- 还有一种显式要求参数为必填项的方法
- ...
- Ellipsis
- 省略号
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
from fastapi import FastAPI, Query
from pydantic import Required
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(default=Required, min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- 列表可以接受多个值
from typing import List, Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[List[str], None] = Query(default=None)):
query_items = {"q": q}
return query_items
from typing import List
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(default=["foo", "bar"])):
query_items = {"q": q}
return query_items
- python3.9之后可以进一步优化
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: list = Query(default=[])):
query_items = {"q": q}
return query_items
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,
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
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
- 想用精准的item-query
- 但这不符合python的小驼峰风格
- 所以声明个别名
- deprecated就是废弃的
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",
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,
max_length=50,
regex="^fixedquery$",
deprecated=True,
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
- 你不得不将其保留一段时间
- 因为有些客户端正在使用它,但你希望文档清楚地将其展示为已弃用。
-
我们可以对于查询参数做出验证
- alias
- title
- description
- deprecated
-
特定于字符串的校验:
- min_length
- max_length
- regex
-
下次再说👋