fastApi笔记02-查询参数

查询参数

在声明不属于路径参数的其他函数参数时,它们会自动被解析成“查询字符串”参数

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=2http://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

http://127.0.0.1:8000/items/3

必须查询参数

想让一个查询参数成为必需的,不声明任何默认值即可。

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。后面试了下才知道只有这四种情况才行,传其他的会报错)

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值