fastapi同时使用路径参数和查询参数

292 阅读2分钟

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

路径参数和查询参数位置无关

  • 一般情况下,路径参数和查询参数会同时存在,比如一个接口中有路径参数item_id和查询参数skiplimit

  • 此时URL: http://127.0.0.1:8000/items/12?skip=1&limit=10

  • 基于这样的URL,我们可以设计下面这样的路径参数和查询参数:

    • 路径操作函数中的item_id在路径函数装饰器中有定义,则item_id被fastapi识别为路径参数
    • 另外两个:skiplimit因为没有特殊说明,默认被识别为查询参数,且是必选参数。
    • 这种情况下,三个参数在函数内的定义顺序是不重要的,fastapi可以识别他们。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 def read_items(item_id: int, skip: int, limit: int):
     data = {"item_id": item_id}
     if skip:
         data.update({"skip": skip})
     if limit:
         data.update({"limit": limit})
     return data

路径参数和查询参数位置有关

  • 但是,如果有特别要求,比如使用了Path或者Query,那在路径操作函数内定义三个参数时需要考虑先后顺序。

情况1:路径参数使用了Path

  • 路径参数item_id使用是Path,那么它的位置必须放在最后
  • 原因:Python中函数的形参定义顺序:位置参数 > 关键字参数(默认值)
 from fastapi import FastAPI, Path
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 def read_items(skip: int, limit: int, item_id: int = Path(ge=10)):
     data = {"item_id": item_id}
     if skip:
         data.update({"skip": skip})
     if limit:
         data.update({"limit": limit})
     return data

情况2:查询参数使用了Query

  • 查询参数skip使用了Query,那么它的位置必须放在最后
  • 和情况类似,此时需要把使用了PathQuery的形参定义在后面。
 from fastapi import FastAPI, Path, Query
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 def read_items(limit: int, item_id: int = Path(ge=10), skip: int = Query(default=1)):
     data = {"item_id": item_id}
     if skip:
         data.update({"skip": skip})
     if limit:
         data.update({"limit": limit})
     return data

情况3:技巧

  • 如果你想图方便,不想刻意保持这些参数的顺序,那刻意使用*
  • 如此一来,在编写代码时不用考虑每个参数的位置了,fastapi会全部按照关键词的形式给每个形参传实参。
 from fastapi import FastAPI, Path, Query
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 def read_items(*, skip: int = Query(default=1), limit: int, item_id: int = Path(ge=10)):
     data = {"item_id": item_id}
     if skip:
         data.update({"skip": skip})
     if limit:
         data.update({"limit": limit})
     return data