持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
路径参数和查询参数位置无关
-
一般情况下,路径参数和查询参数会同时存在,比如一个接口中有路径参数
item_id和查询参数skip和limit -
此时URL:
http://127.0.0.1:8000/items/12?skip=1&limit=10 -
基于这样的URL,我们可以设计下面这样的路径参数和查询参数:
- 路径操作函数中的
item_id在路径函数装饰器中有定义,则item_id被fastapi识别为路径参数 - 另外两个:
skip和limit因为没有特殊说明,默认被识别为查询参数,且是必选参数。 - 这种情况下,三个参数在函数内的定义顺序是不重要的,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,那么它的位置必须放在最后 - 和情况类似,此时需要把使用了
Path或Query的形参定义在后面。
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