-4

我有我的 FastAPI 应用程序定义server.py

app = FastAPI(
debug=True, title="Microservice for APIs",
description="REST APIs",
version="0.0.1",
openapi_url="/v3/api-docs",
middleware=[
    Middleware(AuthorizationMiddleware, authorizor=Auth())
]) 

__init__.py中,我定义了路线

from fastapi import APIRouter
api_router = APIRouter()
api_router.include_router(impl_controller.router, prefix="/impl/data",
                      tags=["APIs for Impl Management"])

impl_controller.py,我已经定义了这样的路线

@router.get('{id}/get_all')
def hello_world():
    return {"msg": "Hello World"}

@router.get('{id}/get_last')
def test():
    return {"msg": "test"}

在中间件中,我试图获取请求路由而不是 URL

def check_for_api_access(self, request: Request):
    request_path = request.scope['path']
    # route_path = request.scope['endpoint']  # This does not exists

    url_list = [
        {'path': route.path, 'name': route.name}
        for route in request.app.routes
    ]

我期待的结果是:{id}/get_all第一个请求和{id}/get_last第二个请求。

我能够获取所有路径的列表,url_list但我想要特定路径的路径request

此处提供的尝试解决方案:https ://github.com/tiangolo/fastapi/issues/486也不适用于我

4

1 回答 1

-1

尽管您可以非常接近标准框架(即没有对框架进行花哨的改动),但您可能无法准确地完成您需要的工作。

在中间件中,您可以直接访问请求。这样,您将能够检查请求的 url,如https://fastapi.tiangolo.com/advanced/using-request-directly/?h=request中所述。此处描述了可访问的属性https://www.starlette.io/requests/


注意由于您只发布了片段,因此很难说出值/变量的来源。

在您的情况下,什么不起作用很简单。如果您查看了我发布的网址,starlette 文档显示了您可以从请求中访问的属性。这包含您正在寻找的属性。

基本上,request_path = request.scope['path']变成request_path = request.url.path. 如果你有前缀,那么你也会得到它,这就是我说的原因You may not be able to accomplish exactly what you need, though you can get very close with the standard framework (i.e. no fancy alterations of the framework).。不过,如果你知道你的前缀,你可以从路径中删除它(它只是一个字符串)。

于 2021-05-18T13:51:57.610 回答