python中fastapi设置查询参数可选或必选
作者:??小飞牛???? 时间:2021-11-04 12:25:18
前言:
在fastapi中,我们定义的查询参数是可以设置成:必选参数 or 可选参数。
可选查询参数
只要给查询参数的默认值设置为
None
,表示该查询参数是可选参数。
from fastapi import FastAPI
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
补充:此时路径操作函数内的参数有两个,一个是路径参数
item_id
,一个是查询参数q
,fastapi是可以区分他们的。
必选查询参数
当你为查询参数设置默认值时,则该参数在URL中不是必须的。
如果你不想添加默认值,而只是想使该参数成为可选的,则将默认值设置为
None
。但当你想让一个查询参数成为必需的,不声明任何默认值就可以.
比如:这里的查询参数
needy
是类型为str
的必需查询参数。
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
如果在URL中没有查询参数
needy
,则报错
{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
可选和必选参数共存
也可以定义一些参数为必需的,一些具有默认值,而某些则完全是可选的
此时:
itme_id
是路径参数,needy
是必选路径参数,skip
是有默认值必选查询参数,limit
是可选查询参数。
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
为可选参数做类型提示
比如一个可选的参数
q
,如有该参数时,他的类型是整型,此时定义类型提示如下使用
typing
模块下的Union
做类型提示,Union[int, None]
表示类型是int
或者None
此时对于URL:
http://127.0.0.1:8000/items/12?q=12
,参数q
就会自动转化为数字12
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
补充1:
可能为空的情况做类型提示,一般使用一个比
typing.Union
更加方便的类型:typing.Optional
因为,
Optional[X] is equivalent to Union[X, None]
所以,上面的类似等价于
q: Optional[int] = None
\
补充2:
只要给查询参数默认值
None
就表示它是可选查询参数,和类型提示无关。类型提示的功能在于如果该值存在是他应该是什么类型的变量并做类型转换和校验。
来源:https://juejin.cn/post/7105568560461643783
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
![](https://img.aspxhome.com/file/2023/8/111988_0s.png)
ASP所有的Session变量获取实现代码
使用python读取txt文件的内容,并删除重复的行数方法
MySQL的命令行提示符及其表达的意思
浅析CMS生成静态页面的两种方案
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
![](https://img.aspxhome.com/file/2023/2/82602_0s.png)
Python入门篇之字典
一文带你了解Python中的字符串是什么
![](https://img.aspxhome.com/file/2023/7/88987_0s.png)
python扩展库numpy入门教程
python中return不返回值的问题解析
![](https://img.aspxhome.com/file/2023/7/63967_0s.jpg)
详解Pandas与openpyxl库的超强结合
![](https://img.aspxhome.com/file/2023/4/120434_0s.png)
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
![](https://img.aspxhome.com/file/2023/2/128342_0s.png)
JS中的public和private对象,即static修饰符
asp如何调用DLL来加快服务器的执行速度?
Python搭建代理IP池实现检测IP的方法
![](https://img.aspxhome.com/file/2023/6/105616_0s.png)