fastapi之路径参数

292 阅读2分钟

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

路径参数

  • 路径参数:在URL中域名或IP:PORT后/后面的路径就是路径参数,它用来表示一个具体的路径
  • 比如下面的例子中/items/apple/items/banana就是两个不同的路径参数。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/apple")
 async def read_item():
     return {"items": ["apple_1", "apple_2"]}
 ​
 @app.get("/items/banana")
 async def read_item():
     return {"items": ["banana_1", "banana_2"]}
  • 启动服务后,在浏览器访问127.0.0.1:8000/items/apple就可以得到响应{"items": ["apple_1", "apple_2"]}

动态路径参数

  • 动态路径参数:路径参数不是写死对的,其中部分是动态变化的
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 async def read_item(item_id):
     return {"items": item_id}

比如上面例子中,路径装饰器中"/items/{item_id}"item_id就是可以动态变化的,它可以被替换为任何值

  • 你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量"
  • 并且路径参数 item_id 的值将作为参数 item_id 传递给路径操作函数
  • 所以,如果你访问http://127.0.0.1:8000/items/foo,将会看到如下响应:{"item_id":"foo"}

有类型的路径参数

  • 如果在路径操作函数中定义的参数item_id没有类型提示,item_id变量都是字符串类型,下面例子中的返回值item_id是字符串。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 async def read_item(item_id):
     return {"item_id": item_id}
 ​
  • 可以使用标准的 Python 类型标注为函数中的路径参数声明类型。
 from fastapi import FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/{item_id}")
 async def read_item(item_id: int):
     return {"item_id": item_id}
  • 此时,函数中的参数item_id为类型为int,将会有如下两个功能:

    • (1)编辑器有自动补全、类型检查
    • (2)浏览器访问http://127.0.0.1:8000/items/3,此时item_id会自动转化为int类型;
    • 浏览器访问http://127.0.0.1:8000/items/foo,将会报错,因为路径参数 item_id 传入的值为 "foo",它不是一个 int
 {
     "detail": [
         {
             "loc": [
                 "path",
                 "item_id"
             ],
             "msg": "value is not a valid integer",
             "type": "type_error.integer"
         }
     ]
 }