Fork me on GitHub

FastAPI请求系列(二) 查询参数与字符串校验

一、基本使用

 查询参数是什么呢?一般前台发送的请求可能是这样的 http://127.0.0.1:8000/items/?skip=0&limit=10 那么"?"之后的就是查询参数每个查询参数直接通过“&”进行连接。查询参数:

  • skip:值为0
  • limit:值为10

那么在FastAPI的后台就需要进行接收。

1、可选、非可选查询参数

from fastapi import FastAPI

app = FastAPI()


@app.get("/query")
async def page_limit(skip: int = 1, limit: int = 10):
    return {"skip": skip, "limit": limit}

在上述实例中声明了两个查询参数的类型是int,并且都有自己的默认值,查询参数与路径参数不同,它不是路径的一部分,所以是可选的。你可以通过下面的请求方式均可:

# 请求一
http://127.0.0.1:8000/query

# 请求二
http://127.0.0.1:8000/query?skip=1   # limit值为空

# 请求三
http://127.0.0.1:8000/query?limit=10 # skip值为空

# 请求四
http://127.0.0.1:8000/query?skip=1&limit=10

其最终的返回结果均是:

{
  "skip": 1,
  "limit": 10
}

当然还可以通过类型声明来进行控制:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/query")
async def page_limit(skip: Optional[int] = 1, limit: Optional[int] = 10):
    return {"skip": skip, "limit": limit}

通过Optional来声明skiip查询参数是可选的int类型,并且默认值是1.。limit同理如此。但是这样用就和之前没有Optional的没啥区别了,所以一般可以这样使用:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/query")
async def page_limit(skip: int = 1, limit: Optional[int] = None):
    if limit:
        return {"skip": skip, "limit": limit}
    return {"skip": skip}

通过判断前台是否传递这个参数的值,来进行返回。

在上述可选查询参数中注意:

  • 如果没有默认值就是必选(必填)参数
  • 如果有默认值就是可选(非必填)参数
  • 如果只是想成为可选参数而不想给一个特定的默认值,就使用Optional并且默认值为None

2、bool类型转换 

如果声明的查询参数是bool类型,它们将会被自动转换:

from fastapi import FastAPI

app = FastAPI()


@app.get("/query/bool/conversion")
async def type_conversion(param: bool = False):
    return param

当访问以下路由:

# 路由一
http://127.0.0.1:8000/query/bool/conversion?param=yes

# 路由二
http://127.0.0.1:8000/query/bool/conversion?param=on

# 路由三
http://127.0.0.1:8000/query/bool/conversion?param=true

# 路由四
http://127.0.0.1:8000/query/bool/conversion?param=True

# 路由五
http://127.0.0.1:8000/query/bool/conversion?param=1

返回值均为true。

3、路径参数与查询参数

上述只是单纯的查询参数,那么实际上路由中既可以有路径参数,同时也可以有查询参数。FastAPI可以识别它们,并且不需要特定的顺序。

from fastapi import FastAPI
from typing import Optional

app = FastAPI()


@app.get("/multi/params/{item_id}")
async def multi_params(item_id: int, skip: int = 1, limit: Optional[int] = None):
    item = {"item_id":item_id,"skip":skip}
    if limit:
        item.update({"limit":limit})
    return item

上述中:

  • item_id 是路径参数,是必填参数
  • skip 是查询参数,是选填参数,默认是1
  • limit 是查询参数,是选填参数,默认值是None

二、进阶

同路径参数中的Path类似,查询参数也提供了一个Query模块提供功能更加完善的参数校验。

from fastapi import FastAPI
from fastapi import Query
from typing import List

app = FastAPI()

@app.get("/query/validations")
def query_params_validate(
        value: str = Query(...,min_length=3,max_length=6,regex="^z"),
        values: List[str] = Query(["V1","V2"])
):

    return value,values

上述中:

  • value 必选参数(存在"...")
  • values 非必选参数(存在默认值)

调用接口:

 通过查看源码,更多校验参数:

class Query(Param):
    in_ = ParamTypes.query

    def __init__(
        self,
        default: Any,
        *,
        alias: Optional[str] = None,
        title: Optional[str] = None,
        description: Optional[str] = None,
        gt: Optional[float] = None,
        ge: Optional[float] = None,
        lt: Optional[float] = None,
        le: Optional[float] = None,
        min_length: Optional[int] = None,
        max_length: Optional[int] = None,
        regex: Optional[str] = None,
        example: Any = Undefined,
        examples: Optional[Dict[str, Any]] = None,
        deprecated: Optional[bool] = None,
        **extra: Any,
    ):
...
...

 

posted @ 2021-06-02 21:12  iveBoy  阅读(803)  评论(0编辑  收藏  举报
TOP