fastapi之查询参数

497 阅读2分钟

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

查询参数

  • URL中?后面按照a=10&b=20形式组织的参数成为查询参数,如:参数a的值是10, 参数b的值是20
  • 在URL中查询参数是可选的,并且如有的话,默认后端接收的原始值都是字符串,所以一般也称之为查询字符串参数

fastapi中的查询参数

  • 路径操作函数内,声明不属于路径参数的其他函数参数,默认被认为是查询参数,且是字符串类型。
  • 比如:这个url中http://127.0.0.1:8000/items/?skip=0&limit=10, 参数skip是字符串0,参数limit是字符串10
  • 这两个参数如果相当int使用,则需要做类型转换。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
 ​
 ​
 @app.get("/items/")
 async def read_item(skip, limit):
     skip = int(skip)
     limit = int(limit)
     return fake_items_db[skip: skip + limit]
  • 上面的例子中,当你为查询参数做了类型提示,它们将转换为该类型并针对该类型进行校验。
  • 比如:这个url中http://127.0.0.1:8000/items/?skip=0&limit=10, 因为做了类型提示,所以不需要手动做类型转换。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
 ​
 ​
 @app.get("/items/")
 async def read_item(skip: int, limit: int):
     print(skip, limit)
     return fake_items_db[skip: skip + limit]
  • 如果定义了查询字符串参数,但是在URL中并没有提供查询字符串参数
  • 例如上面的例子,如果URL是http://127.0.0.1:8000/items/或者http://127.0.0.1:8000/items/?skip=0,因为在URL中缺少了一个或两个查询参数。此时服务会响应422 Unprocessable Entity并返回响应的错误提示
 {"detail":[{"loc":["query","skip"],"msg":"field required","type":"value_error.missing"},{"loc":["query","limit"],"msg":"field required","type":"value_error.missing"}]}
 ​
 {"detail":[{"loc":["query","limit"],"msg":"field required","type":"value_error.missing"}]}

查询参数默认值

  • 如果定义了查询参数,但是URL中可能没有查询参数,此时一个方便的解决思路就是给查询参数提供默认值。
  • 设置默认值的方式是非常方便的,只需要在定义查询参数时给一个那默认值即可。
  • 此时如果URL中缺少哪个查询参数,缺少的查询参数的值就是默认值。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
 ​
 ​
 @app.get("/items/")
 async def read_item(skip: int = 0, limit: int = 10):
     return fake_items_db[skip: skip + limit]
  • 因为有了默认值,此时查询参数的类型提示是可以省略的,fastapi会根据默认值自动推动参数类型。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
 ​
 ​
 @app.get("/items/")
 async def read_item(skip=0, limit=10):
     return fake_items_db[skip: skip + limit]