> 백엔드 개발 > 파이썬 튜토리얼 > FastAPI POST 요청에서 JSON과 파일을 모두 제출하는 방법은 무엇입니까?

FastAPI POST 요청에서 JSON과 파일을 모두 제출하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-04 17:20:39
원래의
616명이 탐색했습니다.

How to Submit Both JSON and Files in a FastAPI POST Request?

FastAPI POST 요청에 파일과 JSON 본문을 모두 추가하는 방법은 무엇입니까?

FastAPI에서는 JSON 데이터와 파일을 모두 보낼 수 없습니다. 본문을 JSON으로 선언하는 경우 단일 요청입니다. 대신 multipart/form-data 인코딩을 사용해야 합니다. 이를 달성하기 위한 몇 가지 방법은 다음과 같습니다.

방법 1: 파일 및 양식 사용

# Assuming you have a DataConfiguration model for the JSON data
from fastapi import FastAPI, File, UploadFile
from pydantic import BaseModel

app = FastAPI()

class DataConfiguration(BaseModel):
    textColumnNames: list[str]
    idColumn: str

@app.post("/data")
async def data(dataConfiguration: DataConfiguration,
               csvFile: UploadFile = File(...)):
    pass  # read requested id and text columns from csvFile
로그인 후 복사

방법 2: Pydantic 모델 및 종속성 사용

from fastapi import FastAPI, Form, File, UploadFile, Depends, Request
from pydantic import BaseModel
from typing import List, Optional, Dict
from fastapi.responses import HTMLResponse
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 validate_json_body(body: str = Form(...)):
    try:
        return Base.model_validate_json(body)
    except ValidationError as e:
        raise HTTPException(
            detail=jsonable_encoder(e.errors()),
            status_code=422,
        )

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

@app.get("/", response_class=HTMLResponse)
async def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
로그인 후 복사

방법 3: 본문 매개변수에서 JSON을 문자열로 전달

from fastapi import FastAPI, Form, UploadFile, File
from pydantic import BaseModel

class Base(BaseModel):
    name: str
    point: float
    is_accepted: bool

app = FastAPI()

@app.post("/submit")
async def submit(data: Base = Form(...), files: List[UploadFile] = File(...)):
    return {
        "JSON Payload": data,
        "Filenames": [file.filename for file in files],
    }
로그인 후 복사

방법 4: 사용자 정의 클래스를 사용하여 JSON 유효성 검사

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

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

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

    @model_validator(mode='before')
    @classmethod
    def validate_to_json(cls, value):
        if isinstance(value, str):
            return cls(**json.loads(value))
        return value

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

@app.get("/", response_class=HTMLResponse)
async def main(request: Request):
    return templates.TemplateResponse("index.html", context={"request": request})
로그인 후 복사

참고 : 방법 1에서는 Form이 Body의 하위 클래스이기 때문에 File과 Form 클래스를 함께 사용할 수 있습니다. 그러나 방법 1에서 Form(...) 대신 Body(...)를 사용하면 FastAPI에서는 JSON 데이터가 양식 데이터가 아닌 요청 본문에 있을 것으로 예상하므로 작동하지 않습니다.

위 내용은 FastAPI POST 요청에서 JSON과 파일을 모두 제출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿