FastAPI查询参数和字符串校验

查询参数和字符串校验

直接上代码吧

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 的类型为 str,默认值为 None,因此它是可选的。可以直接来自动化文档看看
在这里插入图片描述

额外的校验

我们打算添加约束条件:即使 q 是可选的,但只要提供了该参数,则该参数值不能超过50个字符的长度。

导入 Query

直接上代码吧

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=5)):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

此时,q依然是可选的,但是如果你填写了,并且长度大于了5,就会报错,来看效果
在这里插入图片描述

添加更多校验

min_length

你还可以添加 min_length 参数:

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=5, min_length=3)):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

添加正则表达式

正则表达式

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: Union[str, None] = Query(default=None, max_length=50, min_length=3, pattern="^fixedquery$")):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

记住:正则表达式是实际开发中,几乎是最重要的验证方式,即使你需要去数据库中进行查询校验,也应该首先使用正则来校验格式之后再进行数据库查询校验

默认值

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(
        q: Union[str, None] = Query(default="fixedquery", max_length=50, min_length=3, pattern="^fixedquery$")):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

打开自动化文档看看效果
在这里插入图片描述
发送请求
在这里插入图片描述

必需参数

当我们在函数的参数列表中直接写q: str时,就已经表明这个参数是必须的了。代替:


from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: str = Query(min_length=3)):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

看下效果
在这里插入图片描述

使用省略号(…)声明必需参数

有另一种方法可以显式的声明一个值是必需的,即将默认参数的默认值设为 … :

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: str = Query(default=..., min_length=3)):
    results = {"books": [{"book_id": "Foo"}, {"book_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

这样也是一种方法

查询参数列表 / 多个值

直接上代码并且看效果吧

from typing import List, Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: Union[List[str]] = Query(default=...)):
    query_books = {"q": q}
    return query_books

在这里插入图片描述

具有默认值的查询参数列表 / 多个值

from typing import List, Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(q: Union[List[str]] = Query(default=['a','b'])):
    query_books = {"q": q}
    return query_books

在这里插入图片描述

添加 title以及 description:

from typing import List, Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(
        q: Union[List[str]] = Query(default=['a', 'b'], title="这是read_books", description="这是一段描述")):
    query_books = {"q": q}
    return query_books

在这里插入图片描述

别名参数

假设你想要查询参数为 item-query。

像下面这样:

http://127.0.0.1:8000/items/?item-query=foobaritems
但是 item-query 不是一个有效的 Python 变量名称。

最接近的有效名称是 item_query。

但是你仍然要求它在 URL 中必须是 item-query…

这时你可以用 alias 参数声明一个别名,该别名将用于在 URL 中查找查询参数值:

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

弃用参数

现在假设你不再喜欢此参数。

你不得不将其保留一段时间,因为有些客户端正在使用它,但你希望文档清楚地将其展示为已弃用。

那么将参数 deprecated=True 传入 Query:

from typing import List, Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/books/")
async def read_books(
        q: Union[List[str]] = Query(default=['a', 'b'], title="这是read_books", description="这是一段描述",
                                    alias="item-query",
                                    deprecated=True)):
    query_books = {"q": q}
    return query_books

在这里插入图片描述

TIPS

还有很多可以使用的验证,比如数字类型的验证,还需要自己去查看

  • default=default,
  • default_factory=default_factory,
  • alias=alias,
  • alias_priority=alias_priority,
  • validation_alias=validation_alias,
  • serialization_alias=serialization_alias,
  • title=title,
  • description=description,
  • gt=gt,
  • ge=ge,
  • lt=lt,
  • le=le,
  • min_length=min_length,
  • max_length=max_length,
  • pattern=pattern,
  • regex=regex,
  • discriminator=discriminator,
  • strict=strict,
  • multiple_of=multiple_of,
  • allow_inf_nan=allow_inf_nan,
  • max_digits=max_digits,
  • decimal_places=decimal_places,
  • example=example,
  • examples=examples,
  • openapi_examples=openapi_examples,
  • deprecated=deprecated,
  • include_in_schema=include_in_schema,
  • json_schema_extra=json_schema_extra,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值