Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Menghantar Kedua-dua JSON dan Fail dalam Permintaan POST FastAPI?

Bagaimana untuk Menghantar Kedua-dua JSON dan Fail dalam Permintaan POST FastAPI?

Barbara Streisand
Lepaskan: 2025-01-04 17:20:39
asal
616 orang telah melayarinya

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

Bagaimana untuk Menambah Kedua-dua Fail dan Badan JSON dalam Permintaan POST FastAPI?

Dalam FastAPI, anda tidak boleh menghantar kedua-dua data JSON dan fail dalam satu permintaan jika anda mengisytiharkan badan sebagai JSON. Sebaliknya, anda perlu menggunakan pengekodan berbilang bahagian/data bentuk. Berikut adalah beberapa kaedah untuk mencapai ini:

Kaedah 1: Menggunakan Fail dan Borang

# 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
Salin selepas log masuk

Kaedah 2: Menggunakan Model dan Ketergantungan 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})
Salin selepas log masuk

Kaedah 3: Melepasi JSON sebagai Rentetan dalam Parameter Badan

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],
    }
Salin selepas log masuk

Kaedah 4: Menggunakan Kelas Tersuai untuk Mengesahkan 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})
Salin selepas log masuk

Nota: Dalam Kaedah 1 , anda boleh menggunakan kelas Fail dan Borang bersama-sama kerana Borang ialah subkelas Badan. Walau bagaimanapun, jika anda menggunakan Body(...) dan bukannya Form(...) dalam Kaedah 1, ia tidak akan berfungsi kerana FastAPI akan menjangkakan data JSON berada dalam badan permintaan, bukan sebagai data borang.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Kedua-dua JSON dan Fail dalam Permintaan POST FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan