FastAPI:如何访问依赖项内的APIRoute对象

问题描述

我使用的是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'>

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

解决方法

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

即使为该错误创建了解决方法,也无法以正确的方式获得此工作。由于APIRoute不是有效的Pydantic字段类型,因此我们的FastAPI应该为此为此引发FastAPIError。

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

,

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

async def check_permission(req: Request):
   f = req.scope['endpoint'] 
   # f is the function object of the fast api route endpoint
,

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

Request

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...