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

如何将URL作为路径参数传递给FastAPI路由?

张翰海
2023-03-14

我已经使用FastAPI创建了一个简单的API,我正在尝试将URL作为任意的<code>路径</code>参数传递给FastAPI路由。

from fastapi import FastAPI
app = FastAPI()
@app.post("/{path}")
def pred_image(path:str):
    print("path",path)
    return {'path':path}

当我测试它时,它不起作用并抛出错误。我以这种方式测试它:

http://127.0.0.1:8000/https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg

共有1个答案

魏波娃
2023-03-14

您可以简单地使用< code>path转换器来捕获任意路径。根据Starlette文档,< code>path返回路径的其余部分,包括任何附加的< code>/字符。

from fastapi import Request

@app.get('/{_:path}')
def pred_image(request: Request):
    return {"path": request.url.path[1:]}

或者

@app.get("/{full_path:path}")
def pred_image(full_path: str):
    return {"path": full_path}

使用以下方法进行测试:

http://127.0.0.1:8000/https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg

输出:

{"path":"https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg"}

正如@luk2302在评论部分提到的,您的客户端(即最终用户、javascript等)需要对URL进行编码。但是,@luk2302提供的编码URL似乎不起作用,导致“详细信息”:“未找到”错误。事实证明,您需要对其进行两次编码才能工作。即:

http://127.0.0.1:8000/https%253A%252F%252Fraw.githubusercontent.com%252Fultralytics%252Fyolov5%252Fmaster%252Fdata%252Fimages%252Fzidane.jpg

在服务器端,您可以按如下方式解码URL(两次):

from urllib.parse import unquote 

@app.get("/{path}")
def pred_image(path: str):
    return {'path':unquote(unquote(path))}  

由于您的endpoint似乎接受POST请求,您可以考虑让客户端在请求正文中发送图像URL,而不是将其作为路径参数传递。请查看此处、此处和此处的答案,以及FastAPI的留档,了解如何做到这一点。

如果您通过在浏览器的地址栏中键入上述URL来测试这一点,那么请继续使用@app.get()路由,因为当您在浏览器的地址栏中键入URL时,它会执行GET请求。但是,如果您需要它来处理POST请求,您将不得不将endpoint的装饰器更改为@app.post()(如您的问题所示);否则,您将遇到{"详细信息":"方法不允许"}错误。

 类似资料:
  • 对于下面的代码: 我有一个路由器路由到另一个路由器,看起来像这样: 处理程序如下所示: 我的问题是处理程序无权访问请求.params 中的campaign_uid。如何访问campaign_uid/传递给处理程序?

  • 问题内容: 我需要在Web服务调用中将一些值从移动设备传递到服务器,因此我打算将JSON格式的所有值传递如下 以下是我的服务电话 我正在尝试通过这种方式致电上述服务 但是输出是这样的 谁能告诉我为什么我没有获得所有的价值观? 问题答案: 我建议将JSON数据作为请求传递给主体。但是,如果您仍然希望将其作为URL中的参数传递,则必须像下面这样对URL进行编码,例如: 对于前json是:-> 有关UR

  • 例如,在具有分页列表的路由上,网址可能如下所示,表示我们已加载第二个网页: 使用指令和来传递查询参数。例如: 或者,我们可以使用服务通过JS跳转: 读取查询参数 See Official Documentation on Query Parameters

  • 我一直在使用缓冲本地驱动器上的文件来解析和获取某些数据。出于测试目的,我可以很容易地这样做: 文件阅读器。java文件具有以下功能: 现在,我希望将文件路径作为命令行参数传递。我尝试了一些方法,但我对这方面还是有点陌生,没能成功。有人能帮我解释一下我需要做什么样的更改才能将这些更改合并到我的代码中吗。

  • 问题内容: 我正在创建一种通过传递搜索字段从任何表中选择ID的方法。 但是我得到一个有关语法错误的MySqlException。当我查看“异常”消息时,它向我显示带引号的查询表!如何将表格作为不带引号的参数传递? 问题答案: 大多数数据库不允许您通过参数指定表名或列名。参数用于 值 。如果确实确实需要使它动态化,则应验证输入(它应该是一个已知的表名,并且该表中具有已知的列名),然后将其包括在SQL

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。