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