gpt4 book ai didi

python - 使用自定义路径参数将路由添加到 FastAPI

转载 作者:行者123 更新时间:2023-12-05 03:20:01 27 4
gpt4 key购买 nike

我正在尝试从文件中添加路由,但我事先并不知道实际的参数,因此我需要一个通用函数来通过 **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 路径参数不是固定的,我需要从文件中读取它们,为了实现这一点,我正在尝试这样的事情:

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 尝试在 foo 签名中找到不存在的实际参数 xyz

FastAPI 有什么方法可以实现这个吗?或者甚至接受像 /foo/... whatever .../ 这样的路径的任何解决方案?

最佳答案

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

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)
)

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

关于python - 使用自定义路径参数将路由添加到 FastAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73291228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com