2

我正在使用 FastAPI,主应用程序正在使用include_router它向 fastAPI 应用程序添加额外的路由。

我想在所有路线上添加通用验证。我在文档中发现,您可以通过在包含路由器时使用依赖项来实现这一点。

https://fastapi.tiangolo.com/tutorial/bigger-applications/#the-main-fastapi

这有效,并被所有 http 请求执行。到目前为止一切都很好!

现在,我想知道在这个通用验证函数内部(在所有路由中使用 Depends() 注入)哪个路由正在调用该函数。

我找到了一种访问实际请求的方法(使用 fastapi.routing.Request 作为函数的输入参数),但我想访问函数或 APIRoute 本身的名称

from fastapi import FastAPI, Depends
from fastapi.routing import Request, APIRoute

async def check_permission(req: Request, route: APIRoute):
    print("test me")

app = FastAPI()
app.include_router(admin.service_api, dependencies=[Depends(check_permission)])

RuntimeError: no validator found for <class 'fastapi.routing.APIRoute'>

也许这是一个坏主意,我应该以不同的方式来做吗?非常感谢所有建议。谢谢你。

4

3 回答 3

2

我想我找到了一种解决方法(通过使用 Request 对象)。也许它不是很 Pythonic:

async def check_permission(req: Request):
   f = req.scope['endpoint'] 
   # f is the function object of the fast api route endpoint
于 2020-10-20T06:53:37.410 回答
2

实际上使用 Request 对象是最佳实践,因为它保存了 Request 的全部数据,我看不出不使用它的理由。

即使您为此错误创建了解决方法,也无法以正确的方式完成这项工作。因为 APIRoute 不是有效的 Pydantic Field 类型,所以我们的 FastAPI 应该为此引发 FastAPIError。

所以答案是:你应该使用Request对象。

于 2020-10-15T21:37:27.097 回答
0

我希望这会有所帮助,它返回APIRoute对象,可以在依赖项中使用。我不确定这样做是否安全。Request对象应预先注入。

api_route = next(item for item in request.app.routes if isinstance(item, APIRoute) and item.dependant.cache_key[0] == request.scope['endpoint'])
于 2021-08-05T13:18:07.020 回答