【问题标题】:Is it possible to pass Path arguments into FastAPI dependency functions?是否可以将 Path 参数传递给 FastAPI 依赖函数?
【发布时间】:2021-08-05 14:23:10
【问题描述】:

无论如何,FastAPI“依赖”是否可以解释路径参数。 我有很多形式的功能:

@app.post("/item/{item_id}/process", response_class=ProcessResponse)
async def process_item(item_id: UUID, session: UserSession = Depends(security.user_session)) -> ProcessResponse:
    item = await get_item(client_id=session.client_id, item_id=item_id)
    await item.process()

一遍又一遍,我需要传入 [多个] 参数来获取所需的项目,然后再对其进行操作。这是非常重复的,并且使代码非常冗长。我真正想做的是将item 作为参数传递给方法。

理想情况下,我想让get_item 成为一个依赖项,或者以某种方式将它嵌入到路由器中。这将大大减少重复的逻辑和过于冗长的函数参数。问题是客户端在 Path 中传递了一些关键参数。

是否可以将 Path 参数传递给依赖项,或者在路由器中执行依赖项并传递结果?

【问题讨论】:

  • 你可以让你的依赖依赖于一个路径参数,有效地做Depends(item_for_client_from_path)并且让item_for_client_from_path依赖于`item_for_client_from_path(item_id=Path(), session=Depends(security.user_session));即,您创建的依赖项抽象出您每次使用的那些子依赖项。是否符合您的要求?
  • @MatsLindh 可能。从您的评论中,我看不出您将如何从Path() 中提取参数。我是 FastAPI 的新手,所以我很可能错过了一些明显的东西。与上面的示例一样,我需要提取可能不在完全统一位置的路径的一部分。对于某些功能,/item/{item_id}/ ... /foo/bar/item/{item_id}/ 之前可能还有其他项目。
  • 只要参数在两个位置都被命名为item_id,它就会像你期望的那样工作。有时间我会尝试做一个例子
  • 那太好了,谢谢!

标签: fastapi


【解决方案1】:

FastAPI 依赖函数可以采用普通端点函数可以采用的任何参数。

因此,在普通端点中,您可以像这样定义路径参数:

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

现在,如果您想在依赖项中使用该参数,您只需这样做:

from fastapi import Depends, FastAPI

app = FastAPI()

async def my_dependency_function(item_id: int):
    return {"item_id": item_id}


@app.get("/items/{item_id}")
async def read_item(item_id: int, my_dependency: dict = Depends(my_dependency_function):
    return my_dependency

如果参数存在,参数将简单地传递给依赖函数。您还可以在依赖函数中使用 PathQuery 之类的东西来定义它们的来源。

它只会分析请求对象以提取这些值。

这是一个使用 FastAPI 中的Path 函数的示例:

from fastapi import Depends, FastAPI, Path

app = FastAPI()

async def my_dependency_function(item_id: int = Path(...)):
    return {"item_id": item_id}


@app.get("/items/{item_id}")
async def read_item(my_dependency: dict = Depends(my_dependency_function):
    return my_dependency

至于您在路由器中将其实现为依赖项的问题,您可以在创建路由器时执行以下操作:

items_router = APIRouter(
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(my_dependency_function)],
)

或者您可以在应用程序上运行include_router 时执行此操作,例如:

app.include_router(
    items_router,
    prefix="/items",
    dependencies=[Depends(my_dependency_function)],
)

有关依赖项的更多信息和更多此类示例,请参阅https://fastapi.tiangolo.com/tutorial/dependencies/

【讨论】:

  • 非常感谢。关于在路由器上执行此操作,我认为这样定义的依赖项的返回值被丢弃了。显然我可以让依赖函数将结果附加到Request.state。我只是想知道我是否错过了更优雅的方法。
  • 哦,不用等了。我认为this 解释了如何。非常感谢您的帮助!
猜你喜欢
  • 2021-07-29
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2011-04-22
相关资源
最近更新 更多