【Python教程】fastapi设置查询参数可选或必选详解

零 Python教程评论137字数 1686阅读5分37秒阅读模式

所需工具:

Python

聪明的大脑文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

勤劳的双手文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

教程如下

前言:文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

在fastapi中,我们定义的查询参数是可以设置成:必选参数 or 可选参数。文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

可选查询参数

只要给查询参数的默认值设置为None,表示该查询参数是可选参数。文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

[php]
from fastapi import FastAPI文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q=None):
data = {"item_id": item_id}
if q:
data["q"] = q
return data
[/php]文章源自灵鲨社区-https://www.0s52.com/bcjc/pythonjc/12317.html

补充:此时路径操作函数内的参数有两个,一个是路径参数item_id,一个是查询参数q,fastapi是可以区分他们的。

必选查询参数

当你为查询参数设置默认值时,则该参数在URL中不是必须的。
如果你不想添加默认值,而只是想使该参数成为可选的,则将默认值设置为 None。
但当你想让一个查询参数成为必需的,不声明任何默认值就可以.
比如:这里的查询参数 needy 是类型为 str 的必需查询参数。

[php]
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
[/php]

如果在URL中没有查询参数needy,则报错

[php]
{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
[/php]

可选和必选参数共存

也可以定义一些参数为必需的,一些具有默认值,而某些则完全是可选的
此时:itme_id是路径参数,needy是必选路径参数,skip是有默认值必选查询参数,limit是可选查询参数。

[php]
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=None
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
return item
[/php]

为可选参数做类型提示

比如一个可选的参数q,如有该参数时,他的类型是整型,此时定义类型提示如下
使用typing模块下的Union做类型提示,Union[int, None]表示类型是int或者None
此时对于URL:http://127.0.0.1:8000/items/12 q=12,参数q就会自动转化为数字12

[php]
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[int, None] = None):
data = {"item_id": item_id}
if q:
data["q"] = q
return data
[/php]

补充1:

可能为空的情况做类型提示,一般使用一个比typing.Union更加方便的类型:typing.Optional
因为,Optional[X] is equivalent to Union[X, None]
所以,上面的类似等价于q: Optional[int] = None\

补充2:

只要给查询参数默认值None就表示它是可选查询参数,和类型提示无关。
类型提示的功能在于如果该值存在是他应该是什么类型的变量并做类型转换和校验。

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/pythonjc/12317.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论