我正在try 将一些路由添加到FastAPI项目中.新的路由不是事先确定的,代码应该从文件中读取它们.要添加我使用的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路径参数不是固定的,我需要从文件中读取它们,为了实现这一点,我try 如下所示:

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"}]}

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


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

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

然而,我相信有一个更好的方法来做你想做的任何事情,但我需要首先了解你的问题

Python相关问答推荐

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

Polars:用氨纶的其他部分替换氨纶的部分

当独立的网络调用不应该互相阻塞时,'

avxspan与pandas period_range

Pandas计数符合某些条件的特定列的数量

Pandas GroupBy可以分成两个盒子吗?

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如何使regex代码只适用于空的目标单元格

如何杀死一个进程,我的Python可执行文件以sudo启动?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

为什么dict. items()可以快速查找?

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

将字节序列解码为Unicode字符串

时间戳上的SOAP头签名无效

合并Pandas中的数据帧,但处理不存在的列

如何有效地计算所有输出相对于参数的梯度?