Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以让FastAPI端点接收json或文件吗_Python_Fastapi - Fatal编程技术网

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

Python 我可以让FastAPI端点接收json或文件吗,python,fastapi,Python,Fastapi,我正在尝试创建一个FastAPI端点,用户可以在这里上传json格式或gzip文件格式的文档。我可以让端点单独/单独地从这两个方法接收数据,但不能在一个端点/函数中同时接收数据。有没有办法让同一个FastAPI端点接收json或文件 json示例: 从fastapi导入fastapi 从pydantic导入BaseModel 类文档(基本模型): 单词:str app=FastAPI() @app.post(“/document/”) 异步def创建项目(document\u json:docu

我正在尝试创建一个FastAPI端点,用户可以在这里上传json格式或gzip文件格式的文档。我可以让端点单独/单独地从这两个方法接收数据,但不能在一个端点/函数中同时接收数据。有没有办法让同一个FastAPI端点接收json或文件

json示例:

从fastapi导入fastapi
从pydantic导入BaseModel
类文档(基本模型):
单词:str
app=FastAPI()
@app.post(“/document/”)
异步def创建项目(document\u json:document):
返回文档
文件的示例:

从fastapi导入fastapi、文件、上载文件
从fastapi.middleware.gzip导入GZipMiddleware
app=FastAPI()
app.add_中间件(GZipMiddleware)
@app.post(“/document/”)
异步定义创建项目(文档:UploadFile=File(…):
返回文件
不适用于或的示例:

从输入导入可选
从fastapi导入fastapi、文件、上载文件
从fastapi.middleware.gzip导入GZipMiddleware
从pydantic导入BaseModel
类文档(基本模型):
字:可选[str]=无
app=FastAPI()
app.add_中间件(GZipMiddleware)
@app.post(“/document/”)
异步定义创建_项(
document_json:document,document_gzip:Optional[UploadFile]=文件(无)
):
返回文档_json,文档_gzip
在使用两个选项的“不工作示例”中,将json文档设置为必填项。也就是说,必须提供参数。我想发布json文档而不是文件是可行的,但反过来会失败。我说得对吗

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

根据您的评论进行编辑: 这可能是因为
Fastapi
如何为您处理请求。由于您从正文中同时指定了
JSON
File
,因此
Fastapi
可能只使用最后一个(这只是我的假设,探索这一点可能很有趣)。因此,它将始终考虑所有参数(除了<代码>获取/代码>)作为文件对象,并在请求的正文中签入文件。

您可以尝试使用原始的
请求
对象来检查主体是否存在任何
JSON

下面是一个可能的例子。由于
Fastapi
是基于
Starlette
的,所以两者之间有几个功能是共享的。
请求
对象就是其中之一。以下是包含更多信息的文档(以备您需要)

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

@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
实际上,在我的“不起作用的示例”中,返回体显示类似于
{“detail”:[{“loc”:[“body”,“documents\u json”],“msg”:“field required”,“type”:“value\u error.missing”}
。如果我做了您建议的更改,两者都返回状态代码204,就好像它们都工作一样,gzip文件也工作,但是json实际上不接受json,我只返回
null
(这与实际接收json数据的“使用json的示例”不同)。
@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