【问题标题】:How to pass URL as a path parameter to a FastAPI route?如何将 URL 传递给 FastAPI 路由?
【发布时间】:2022-08-09 20:54:55
【问题描述】:

我使用 FastAPI 创建了一个简单的 API:

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
  • 路径需要进行 url 编码。
  • 我需要在通过之前还是通过之后进行编码
  • 之前...http://127.0.0.1:8000/https%3A%2F%2Fraw.githubusercontent.com%2Fultralytics%2Fyolov5%2Fmaster%2Fdata%2Fimages%2Fzidane.jpg 将是正确的网址。
  • 假设我提供了一个需要用户传递路径的 API。所以最终用户必须先对其进行编码?
  • 客户端,无论是最终用户,浏览器,javascript,都没有关系。

标签: python fastapi


【解决方案1】:

选项1

您可以简单地使用path 转换器(如Starlette documentation 中所述)来获取path,包括任何其他/ 字符。

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

使用以下测试:

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

选项 2

正如 cmets 部分中提到的@luk2302,您的客户端(即最终用户、javascript 等)需要对 URL 进行编码。但是,@luk2302 提供的编码 URL 似乎不起作用,导致 "detail": "Not Found" 错误。事实证明,您需要对其进行编码两次去工作。那是:

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.post("/{path}")
def pred_image(path: str):
    return {'path':unquote(unquote(path))}  

选项 3

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


笔记:

如果您通过在浏览器的地址栏中键入上述 URL 来测试这一点 - 而不是某种其他客户端,例如,通过 Javascript、Python 请求等 - 您需要改变方法仅将您的端点转移到 GET(即,对于选项 1:@app.api_route('/{_:path}', methods=["GET"]) 和对于选项 2:@app.get("/{path}"))。否则,如果尝试通过浏览器的地址栏进行测试,您将遇到{"detail":"Method Not Allowed"} 错误(当您在浏览器的地址栏中键入 URL 时,它会执行GET 请求)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2015-12-02
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多