fastapi之路径参数Path

547 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

路径参数Path

  • 与使用 Query 为查询参数声明更多的校验和元数据的方式相同,也可以使用 Path 为路径参数声明相同类型的校验和元数据。
  • 设置默认值,字符串校验、数字比较、openapi元数据设置等。
  • 路径参数没有默认值
  • 路径参数是必选的
  • 不过在Path中依然可以使用default,不过设置不会生效。

数值比较

  • 比较数字大小(只能用在数字类型上,比如int或者float)

    • gt:大于(greater than)
    • ge:大于等于(greater than or equal)
    • lt:小于(less than or equal)
    • le:小于等于(less than or equal)
 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_idbook_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}