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 중국어 웹사이트의 기타 관련 기사를 참조하세요!