当前位置: 首页 > 知识库问答 >
问题:

使用自定义路径参数添加到FastAPI的路由

吴开宇
2023-03-14

我正在尝试从文件中添加路由,但我事先不知道实际参数,因此我需要有一个通过**kwargs处理参数的通用函数。

要添加路线,我使用add_api_route,如下所示:

from fastapi import APIRouter

my_router = APIRouter()

def foo(xyz):
    return {"Result": xyz}

my_router.add_api_route('/foo/{xyz}', endpoint=foo)

以上工作正常。

但是enrty path参数不是固定的,我需要从文件中读取它们,为了实现这一点,我正在尝试这样的事情:

from fastapi import APIRouter

my_router = APIRouter()

def foo(**kwargs):
    return {"Result": kwargs['xyz']}

read_from_file = '/foo/{xyz}' # Assume this is read from a file

my_router.add_api_route(read_from_file, endpoint=foo)

但它抛出此错误:

{"detail":[{"loc":["query","kwargs"],"msg":"field required","type":"value_error.missing"}]}

FastAPI尝试在<code>foo</code>签名中查找不存在的实际参数<code>xyz</code>。

FastAPI中有什么方法可以实现这一点吗?或者任何接受像< code>/foo/这样的路径的解决方案...无论什么.../?

共有2个答案

李奕
2023-03-14

如下所述,您可以使用Starlette提供的path转换器来捕获任意路径。示例

from fastapi import APIRouter, FastAPI

app = FastAPI()
my_router = APIRouter()

def foo(rest_of_path: str):
    return {"rest_of_path": rest_of_path}
    
route_path = '/foo/{rest_of_path:path}'
my_router.add_api_route(route_path, endpoint=foo)
app.include_router(my_router)

输入测试:

http://127.0.0.1:8000/foo/https://placebear.com/cache/395-205.jpg

输出:

{"rest_of_path":"https://placebear.com/cache/395-205.jpg"}
潘弘壮
2023-03-14

这将生成一个具有新签名的函数(我假设每个参数都是字符串):

from fastapi import APIRouter
import re
import inspect

my_router = APIRouter()


def generate_function_signature(route_path: str):
    args = {arg: str for arg in re.findall(r'\{(.*?)\}', route_path)}
    
    def new_fn(**kwargs):
        return {"Result": kwargs['xyz']}

    params = [
        inspect.Parameter(
            param,
            inspect.Parameter.POSITIONAL_OR_KEYWORD,
            annotation=type_
        ) for param, type_ in args.items()
    ]

    new_fn.__signature__ = inspect.Signature(params)
    new_fn.__annotations__ = args
    return new_fn


read_from_file = '/foo/{xyz}' # Assume this is read from a file

my_router.add_api_route(
    read_from_file,
    endpoint=generate_function_signature(read_from_file)
)

但是,我相信有更好的方法来做您想做的任何事情,但我需要先了解您的问题

 类似资料:
  • 我用jmod工具创建了一个简单的文件,如下所示 接下来,我试图通过运行以下命令在该模块中执行一个类: 这导致了以下例外情况: 如果我只是将我的目录(我用来创建JMOD文件)设置为modulepath,那么一切都正常工作。 在modulepath上通常不可能有文件吗?如果是这样的话,有什么原因吗?

  • 我想在定义路线时向路线添加一些自定义数据。 我该怎么做? 比如: 我不希望自定义数据显示在URL中。我只是在内部使用它。

  • 我已经使用FastAPI创建了一个简单的API,我正在尝试将URL作为任意的<code>路径</code>参数传递给FastAPI路由。 当我测试它时,它不起作用并抛出错误。我以这种方式测试它:

  • 我目前正在开发基于Quarkus的API,该API将托管在API网关上,该网关要求我们的应用程序以基本路径运行,我通过设置Quarkus发现了这一点。放松。应用程序中的路径。属性我可以使用基本路径运行应用程序,并且它将自动添加到规范中。 我正在使用org生成一个OpenAPI 3规范。日食微文件。openapi。注释。我的问题是,在规范中,这个基本路径被添加到每个操作中。相反,我试图只在服务器声明

  • 我使用的是Spring Boot 1.3.3和swagger springmvc:1.0.2。我正在将应用程序的基本路径设置为“/”。而斯威格正在 http://localhost:9000/swagger/index.html 我需要更改它,但将应用程序的根目录保留为“/”。我需要写一条规则,比如: 如果有人打http://localhost:9000/SOMETHING/swagger/ind

  • 我想在共享主机中安装laravel,我遵循了这里的步骤https://stackoverflow.com/a/28449523 但是我的资产路径不包括公共目录 而不是这个 我明白了 如何在不更改任何核心类的情况下更改资产文件夹的目录(将public添加到资产)?