查询参数
在声明不属于路径参数的其他函数参数时,它们会自动被解析成“查询字符串”参数
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}, {"item_name": "Kael"}]
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 2):
return fake_items_db[skip: skip + limit]
查询字符串是键值对的集合,这些键值对位于url的?之后,多个时以&符号分隔
比如在http://127.0.0.1:8000/items/?skip=0&limit=2中查询参数
skip:对应的值为0,
limit:对应的值是2
由于是url中的一部分,它们的初始值是str类型,但是方法中指定查询参数为int类型,所以进行了转换,并且也会有相应的类型校验
默认值
由于查询参数不使url路径中的固定部分,所以可以设置为可选,并且是有默认值
在上面的示例中,它们具有skip=0和limit=2的默认值
因此访问http://127.0.0.1:8000/items/?skip=0&limit=2和http://127.0.0.1:8000/items/效果是一样的。
但是访问http://127.0.0.1:8000/items/?skip=1这时skip是url中的值也就是1,limit是默认值2
可选参数
通过将参数的默认值设为None,即可将参数设为可选参数
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: str, q: Union[str, None] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
http://127.0.0.1:8000/items/3?q=test
必须查询参数
想让一个查询参数成为必需的,不声明任何默认值即可。
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_user_item(item_id: str, needy: str):
item = {"item_id": item_id, "needy": needy}
return item
由于请求的url中没有needy这个参数,所以会报错
http://127.0.0.1:8000/items/3?needy=test
在请求的url中加上needy参数就正常了
多个路径参数和查询参数
当然也可以定义一些参数为必需的,一些具有默认值,而某些则完全是可选的:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_user_item(
item_id: str, needy: str, skip: int = 0, limit: int = 2, q: str | None = None
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit, "q": q}
return item
http://127.0.0.1:8000/items/3?needy=test&q=100
在这个例子中有1个路径参数,4个查询参数
item_id:路径参数
needy:一个必需的str类型参数
skip:一个默认值为0的int类型参数
limit:一个默认值为2的int类型参数
q:一个可选的str类型参数
查询参数类型转换
还可以声明bool类型,它们会被自动转换
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: str, q: Union[str, None] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
如果对应参数是bool类型的,在传 0/1、yes/on 、on/off、true/false。这些值是不区分大小写都会转成对应的true/false。(看官网的示例我还以为只要有传值都算是True。后面试了下才知道只有这四种情况才行,传其他的会报错)