首页 > 后端开发 > Python教程 > 如何在 FastAPI POST 请求中同时处理文件和 JSON 正文?

如何在 FastAPI POST 请求中同时处理文件和 JSON 正文?

Patricia Arquette
发布: 2024-12-26 20:20:11
原创
251 人浏览过

How to Handle File and JSON Body Simultaneously in a FastAPI POST Request?

如何在 FastAPI POST 请求中添加文件和 JSON 正文?

FastAPI 是一个用于构建 API 的现代、快速(高性能)Web 框架。它基于Python 3.6,提供了一组强大的工具和功能,使API的开发更加简单、高效。 FastAPI 的关键功能之一是它支持处理各种请求类型,包括带有文件和 JSON 正文的 POST 请求。

在本文中,我们将探讨如何处理文件和 JSON 正文FastAPI POST 请求。我们将介绍不同的方法并提供代码示例以简化理解和实现。让我们开始吧!

处理 FastAPI POST 请求中的文件和 JSON 正文

要处理 FastAPI POST 请求中的文件和 JSON 正文,您可以使用以下方法:

使用表单和文件:此方法允许您在路径操作中声明多个表单参数。但是,您也不能声明希望以 JSON 形式接收的 Body 字段,因为请求将使用 application/x-www-form-urlencoded 而不是 application/json 来编码正文(当表单包含文件时,它会被编码为多部分) /form-data).

使用 Pydantic 模型和依赖项:您可以使用 Pydantic 模型通知端点参数化变量依赖于基类。您可以直接在端点中定义查询参数,如本答案所示。

将正文数据作为单个参数传递:另一种选择是将正文数据作为单个参数(表单类型)传递,格式为一个 JSON 字符串。为此,您需要在服务器端创建一个依赖函数。

将自定义类与 Classmethod 结合使用:您还可以将自定义类与用于将给定 JSON 字符串转换为Python 字典,然后用于针对 Pydantic 模型进行验证。

使用 Base64 编码文件:此方法涉及将文件字节转换为 Base64 格式字符串并将其与您可能想要发送到服务器的其他数据一起添加到 JSON 对象中。但是,由于文件大小增加以及编码和解码所需的额外资源,不强烈推荐这种方法。

代码示例

让我们探索一些代码示例来演示如何处理使用不同方法的 FastAPI POST 请求中的文件和 JSON 正文:

使用表单和文件的方法:

from fastapi import Form, File, UploadFile, FastAPI
from typing import List
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.post("/submit")
def submit(
    name: str = Form(...),
    point: float = Form(...),
    is_accepted: bool = Form(...),
    files: List[UploadFile] = File(...),
):
    return {
        "JSON Payload": {"name": name, "point": point, "is_accepted": is_accepted},
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
登录后复制
登录后复制

方法使用 Pydantic 模型和依赖项:

from fastapi import Form, File, UploadFile, Request, FastAPI, Depends
from typing import List, Optional
from fastapi.responses import HTMLResponse
from pydantic import BaseModel
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

class Base(BaseModel):
    name: str
    point: Optional[float] = None
    is_accepted: Optional[bool] = False


def checker(data: str = Form(...)):
    try:
        return Base.model_validate_json(data)
    except ValidationError as e:
        raise HTTPException(
            detail=jsonable_encoder(e.errors()),
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        )


@app.post("/submit")
def submit(base: Base = Depends(checker), files: List[UploadFile] = File(...)):
    return {
        "JSON Payload": base,
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
登录后复制

使用自定义类和 Classmethod 的方法:

from fastapi import Form, File, UploadFile, FastAPI
from typing import List
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.post("/submit")
def submit(
    name: str = Form(...),
    point: float = Form(...),
    is_accepted: bool = Form(...),
    files: List[UploadFile] = File(...),
):
    return {
        "JSON Payload": {"name": name, "point": point, "is_accepted": is_accepted},
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
登录后复制
登录后复制

通过这些方法,您可以根据您的具体要求灵活地处理 FastAPI POST 请求中的文件和 JSON 正文。无论您需要使用 Pydantic 模型验证数据还是只是接收 JSON 字符串,都有合适的解决方案可用。

结论

在本文中,我们探索了处理这两个文件的各种方法FastAPI POST 请求中的 JSON 正文。通过提供代码示例和详细解释,我们的目标是使这些方法的理解和实现尽可能简单。在开发 API 时,您可以根据自己的要求和偏好选择最合适的方法。

如果

以上是如何在 FastAPI POST 请求中同时处理文件和 JSON 正文?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板