我正在尝试从文件中添加路由,但我事先不知道实际参数,因此我需要有一个通过**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/这样的路径的解决方案...无论什么.../?
如下所述,您可以使用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"}
这将生成一个具有新签名的函数(我假设每个参数都是字符串):
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添加到资产)?