前篇我们简单讲了FastAPI的路径参数,Query参数以及参数类型,算是领大家入了门,这篇来详细的讲解下FastAPI的Query参数与字符串验证。
让我们看下面的例①:
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": "apple"}]}
if q:
results.get('items').append({"item_id": q})
return results
观察上面代码,你会发现如下几点:
- 包含一个Query参数q
- 参数q的类型为Optional[str],这就意味着它的值只能是str类型或None
- 参数q有默认值None,这意味着它变成了一个可选参数
得到这三点,上面的代码就理解了。
验证
大家在一些网站的注册页面,填写账号之类的信息时一般都会碰到要求输入的信息长度,比如必须在6-12个字符之间,这类的要求很常见,在FastAPI中,很方便的实现了这类的验证功能。
在验证之前先来看例②:
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None)):
results = {"items": [{"item_id": "apple"}]}
if q:
results.get('items').append({"item_id": q})
return results
在例②中,我们从fastapi中导入了Query,并把q参数的默认值改成了Query(None)
这里导入了Query,那么它在上例中起到了什么作用呢?
Query的第一个参数用于定义默认值。
q: Optional[str] = Query(None) 等价于 q: Optional[str] = None
我们明白了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, min_length=6, max_length=12)):
results = {"items": [{"item_id": "apple"}]}
if q:
results.get('items').append({"item_id": q})
return results
这个例子是从例②修改而来,细心的你可能已经发现了它的不同之处:
- Query(None) 变成了Query(None, min_length=6, max_length=12)
这个例子中,出现了两个新的参数,它们适用于字符串类型的参数
- min_length 允许的最小长度
- max_length 允许的最大长度
这将验证数据,当数据无效时显示清楚的错误。
Query其他一些常见的参数
- lt 需小于多少,适用于数值类型的参数
- le 需小于等于多少,适用于数值类型的参数
- gt 需大于多少,适用于数值类型的参数
- ge 需大于多少,适用于数值类型的参数
使用正则表达式验证
- regex 可以定义参数应匹配的正则表达式
一起来看下面的例④:
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, regex=r'^\d+$')):
results = {"items": [{"item_id": "apple"}]}
if q:
results.get('items').append({"item_id": q})
return results
上面的例子中,用正则限制了参数的输入只能接收数字组成的字符串。
regex参数的写法:
- 以 ^ 符号开头
- 以 $ 符号结尾
- 中间为正则表达式内容
必传参数
Query的第一个参数用于设置默认值,那么一但设置了该参数就因为设置了默认值而变成了可选参数,那么怎么通过它来设置必传的参数呢?
来一起看下面的例⑤:
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(..., max_length=20)):
results = {"q": q}
return results
Query第一个参数传入...,来设置参数q是必传参数。
Query参数列表/多个值
当你明确用 Query
定义Query参数的时候,你也可以声明该参数获取一个列表,或者说获取多个值。
来看下面的例⑥:
from typing import List
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(..., max_length=10)):
results = {'q': q}
return results
通过上面所讲内容,分析下该代码:
- Query参数q
- 类型为List且其内元素必须为str类型
- 必传
- 最大长度10
分析完成后,可以访问下面连接:
http://127.0.0.1/items/?q=banana&q=apple
此时会收到参数q的多个值,并用列表存储。
测试上面代码输出为:
{
"q":["banana","apple"]
}
注意:要声明类型为list的Query参数,需要使用Query,否则它将被解释成请求正文。
使用 list
例⑥中,你会发现在输入的时候限制了输入类型,如果不想限制该怎么办呢?
来看例⑦:
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: list = Query([])):
results = {'q': q}
return results
在这种情况下,FastAPI将不会检查列表的内容。