fastapi教程翻译(六):Path参数 & 数值验证
与使用 Query
声明查询参数的更多验证和元数据的方法相同,也可以通过Path
声明路径参数的相同类型的验证和元数据。
一、Import Path
首先,从fastapi
中导入 Path
:
from fastapi import FastAPI, Path, Query
二、声明元数据
你可以声明 Query
中所有参数.
例如,要为路径参数item_id
声明一个title
元数据值,您可以输入:
item_id: int = Path(..., title="The ID of the item to get"), q: str = Query(None, alias="item-query")
注意:
Path
参数是必须的,因为它是路径的一部分,因此你需要用...
声明标志这是必需参数- 尽管如此,即使你声明为
None
或者设置一个默认值,它并不会有什么改变,仍然需要传入路径参数。
三、根据需要为参数排序
假如,你现在想声明一个查询参数q
, 该参数为必需参数,类型为str
但是,你并不需要声明
q
的其他任意属性,这时候你没有必要使用Query
然后,你需要声明一个路径参数item_id
对于Python而言,如果你将一个带有默认值的参数放在一个没有默认值的参数前面。
但是你可以重新为他们排序,将那些没有默认值的参数放在默认值参数前面
但是对于FastAPI 而言,这并没有多大的影响,因为FastAPI通过名字,类型和默认声明去检测参数 (Query
, Path
, etc),并不关心参数的顺序。
因此,你可以这样定义你的函数:
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
q: str, item_id: int = Path(..., title="The ID of the item to get") ):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
四、参数排序技巧
如果要声明q查询参数而不使用Query或任何默认值,并且使用Path声明路径参数item_id并使用不同的顺序,则Python对此有一些特殊的语法。
传递
*
作为函数的第一个参数。Python不会对那个
*
做任何事情,但是它将知道*
之后所有参数都应称为关键字参数(键-值对),也称为kwargs
。 即使它们没有默认值。
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*, item_id: int = Path(..., title="The ID of the item to get"), q: str ):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
五、数字验证:大于或等于
使用Query和Path以及后面将介绍的其他方法,您可以声明字符串约束,但也可以声明数字约束。
在这里,当ge = 1时,item_id必须是整数“ g
大于或等于e
等于1”。
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*, item_id: int = Path(..., title="The ID of the item to get", ge=1), q: str ):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
六、数字验证器:大于等于或小于或等于
同样适用于:
-
gt
: 大于 -
le
: 小于等于
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*,
item_id: int = Path(..., title="The ID of the item to get", gt=0, le=1000), q: str,
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
七、数字验证器:浮点数、大于或小于
数字验证器同样适用于float
数值:
在这里,只能声明gt
,不能声明ge
。
与此类似,例如,您可以要求值必须大于“ 0”,即使该值小于“ 1”也是如此。
因此,0,5
就是个有效值,但是0.0
或0
就不是.
同样的道理对于lt
.
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*,
item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
q: str,
size: float = Query(..., gt=0, lt=10.5) ):
results = {"item_id": item_id}
if q:
results.update({"q": q})
return results
八、总结
使用 Query
, Path
(目前为止) 你可以声明元数据和字符串验证(t前面的章节).
你也可以声明数字验证器:
-
gt
: 大于 -
ge
: 大于等于 -
lt
: 小于 -
le
: 小于等于
说明
Query
, Path
和其他类型,稍后你将会看见是一个公共类Param
的子类。
它们都共享您已经看到的附加验证和元数据的所有相同参数。
技术细节
当您从FastAPI中导入Query
,Path
和其他对象时,它们实际上是函数。
当被调用时,返回同名类的实例。
因此,您将导入Query
这个功能。 当您调用它时,它返回一个也称为Query
的类的实例。
这些函数在那里(而不是直接使用类),以便您的编辑器不会标记有关其类型的错误。
这样,您可以使用常规的编辑器和编码工具,而不必添加自定义配置来忽略这些错误。