gpt4 book ai didi

python - 我可以让 FastAPI 端点接收 json 或文件吗

转载 作者:行者123 更新时间:2023-12-04 15:10:13 27 4
gpt4 key购买 nike

我正在尝试制作一个 FastAPI 端点,用户可以在其中上传 json 格式或 gzip 文件格式的文档。我可以让端点单独/分别从这两种方法接收数据,但不能在一个端点/函数中一起接收数据。有没有办法让同一个 FastAPI 端点接收 json 或文件?

json 示例:

from fastapi import FastAPI
from pydantic import BaseModel


class Document(BaseModel):
words: str


app = FastAPI()


@app.post("/document/")
async def create_item(document_json: Document):
return document_json

文件示例:

from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.gzip import GZipMiddleware


app = FastAPI()
app.add_middleware(GZipMiddleware)


@app.post("/document/")
async def create_item(document_gzip: UploadFile = File(...)):
return document_gzip

非此即彼的工作示例:

from typing import Optional
from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.gzip import GZipMiddleware
from pydantic import BaseModel


class Document(BaseModel):
words: Optional[str] = None


app = FastAPI()
app.add_middleware(GZipMiddleware)


@app.post("/document/")
async def create_item(
document_json: Document, document_gzip: Optional[UploadFile] = File(None)
):
return document_json, document_gzip

最佳答案

在你的“不工作的例子”中,有两个选项,使 json 文件成为强制性的。也就是说,必须提供参数。我想发布 json 文档而不是文件有效,但反之则失败。我说得对吗?

无论如何,正确的代码应该如下所示(注意:我没有测试过):

@app.post("/document/")
async def create_item(
document_json: Document = None, document_gzip: Optional[UploadFile] = File(None)
):
# Check that either are not none
return document_json, document_gzip

根据您的评论进行编辑:

这可能与 Fastapi 为您处理请求的方式有关。由于您在正文中指定了 JSONFile,因此 Fastapi 可能只使用最后一个(这只是我的假设,可能很有趣探索那个)。因此,它将始终将所有参数(GET 除外)视为文件对象,并在请求的主体中检查文件。

您可以尝试使用原始 Request 对象来检查任何 JSON 的正文。

下面是一个可能的例子。由于 Fastapi 是基于 Starlette 的,因此两者共享一些功能。 Request 对象就是其中之一。这是包含更多信息的文档(以备不时之需)

https://www.starlette.io/requests/

下面是更新的例子,我没有测试,但应该可以工作

@app.post("/document/")
async def create_item(
req: Request, document_gzip: Optional[UploadFile] = File(None)
):
if document_gzip is None:
# Maybe use a try except (i.e. try-catch) block... just in case
document_json = await req.json()

# Check that either are not none
return document_json, document_gzip

关于python - 我可以让 FastAPI 端点接收 json 或文件吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65328025/

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