持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
路径参数Path
- 与使用
Query为查询参数声明更多的校验和元数据的方式相同,也可以使用Path为路径参数声明相同类型的校验和元数据。 - 设置默认值,字符串校验、数字比较、openapi元数据设置等。
- 路径参数没有默认值
- 路径参数是必选的
- 不过在
Path中依然可以使用default,不过设置不会生效。
数值比较
-
比较数字大小(只能用在数字类型上,比如int或者float)
gt:大于(greaterthan)ge:大于等于(greater than orequal)lt:小于(less than orequal)le:小于等于(less than orequal)
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
路径参数的顺序
- 如果有多个路径参数,需要关注下路径参数的顺序,比如下面的例子中有两个路径参数:
item_id和book_id - 如果URL:
http://localhost:8000/items/12/20, 没问题,item_id被赋值为数字12,book_id被赋值为20;并且此时路径操作函数内的两个形参定义的顺序无关。
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}/{book_id}")
def read_items(book_id: int, item_id: int): # 可以交互两个形参的位置
return {"item_id": item_id, "book_id": book_id}
- 但是如果前面的路径参数使用了
Path,则会有Python语法错误(位置参数不能放在关键字参数后面)
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}/{book_id}")
def read_items(book_id: int = Path(ge=5), item_id: int): # 报错
return {"item_id": item_id, "book_id": book_id}
- 解决思路1:交换两个路径参数的先后顺序
@app.get("/items/{item_id}/{book_id}")
def read_items(item_id: int, book_id: int = Path(ge=5), ):
return {"item_id": item_id, "book_id": book_id}
- 解决思路2:把
*当第一个参数【之后的所有参数都应作为关键字参数(键值对)】
@app.get("/items/{item_id}/{book_id}")
def read_items(*, book_id: int = Path(ge=5), item_id: int, ):
return {"item_id": item_id, "book_id": book_id}