Query Parameters


Query Parameters

当声明的函数参数不是路径参数的一部分时,它们会被自动的解释为查询参数(可以直观的理解为 URL 中 ? 后面,以 & 分割的键值对)

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

在上述例子中,如果访问 http://127.0.0.1:8000/items/?skip=0&limit=10 ,则查询参数为:

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

查询参数作为 URL 的一部分,默认是字符串类型,如果被声明为其他的 python 类型,例如在上面的例子中被声明为 int ,则会被自动转化成整数类型并进行类型检查

适用于路径参数的过程同样适用于查询参数

  • 编辑器支持
  • 数据解析
  • 数据验证
  • 自动文档

Defaults

由于查询参数不是路径中固定的一部分,因此它们是可选的,并且可以有默认值

在上述例子中,访问 http://127.0.0.1:8000/items/ 和访问 http://127.0.0.1:8000/items/?skip=0&limit=10 是等价的

,但是如果访问 http://127.0.0.1:8000/items/?skip=20 ,则查询参数为:

  • skip:20
  • limit:10

Optional parameters

同样的,可以通过将默认值指定为 None 来声明可选查询参数

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

在上述例子中,参数 q 是可选的,并且默认值是 None

FastAPI 可以自动识别 item_id 为路径参数,q 是可选参数

Query parameter type conversion

同样可以声明 bool 类型,它们也会被自动转换

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = 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

在这个例子中,访问如下网址及其大小写变体,都有 short=True 成立,相反的意思 则为 False

  • http://127.0.0.1:8000/items/foo?short=1

  • http://127.0.0.1:8000/items/foo?short=True

  • http://127.0.0.1:8000/items/foo?short=true

  • http://127.0.0.1:8000/items/foo?short=on

  • http://127.0.0.1:8000/items/foo?short=yes

:相反的意思指的是单词的意思相反,如 0-1,true-false 等,访问其他不可解析的路径时会报错

Multiple path and query parameters

可以同时声明多个路径参数和查询参数,FastAPI 知道如何进行选择

由于 FastAPI 是根据参数的名字来判断的,因此对参数的声明顺序没有要求

from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
    user_id: int, item_id: str, q: str = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_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

Required query parameters

当声明的非路径参数(目前只介绍了查询参数)有默认值时,它不是必须的

如果只想设置可选参数而不指定特定值,则可以设置默认值为 None

如果想要让查询参数是必须的,只需要不指定默认值

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item

在上面的例子中,needy 是类型为 str 的必须查询参数

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str, skip: int = 0, limit: int = None):
    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
    return item

在上面的例子中,查询参数有 3 个:

  • needy:类型为 str 的必选参数
  • skip:类型为 int 的可选参数,默认值为 0
  • limit:类型为 int 的可选参数

:可以同上一节一样使用枚举变量

Optional type declarations

:高级用法

mypy 中,如果使用:

limit: int = None

可能会出现错误:

Incompatible types in assignment (expression has type "None", variable has type "int")

可以通过 Optional 告知 mypy 值可以为 None ,例如:

from typing import Optional

limit: Optional[int] = None

在路径声明中,可以这样写

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, limit: Optional[int] = None):
    item = {"item_id": item_id, "limit": limit}
    return item

文章作者: qiufeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qiufeng !
评论
 上一篇
Request Body Request Body
Request Body当需要从客户端(如浏览器)发送数据到 API 时,可以借助 request body request body:从客户端发送到 API 的数据 response body:从 API 发送到客户端的数据 API 总
2020-04-11
下一篇 
integer divisibility integer divisibility
整除定义$a, b \in Z$ 且 $b \neq 0$ ,如果存在 $q \in Z$ 使得$$a=q \cdot b$$则称 $b$ 整除 $a$ 或者 $a$ 被 $b$ 整除,记作 $b | a$ ,$b$ 称为 $a$ 的因数,
2020-04-11
  目录