Bagaimana untuk menambah kedua-dua fail dan isi JSON dalam permintaan FastAPI POST?
FastAPI ialah rangka kerja web moden, pantas (berprestasi tinggi) untuk membina API. Ia berdasarkan Python 3.6 dan menyediakan set alat dan ciri yang berkuasa untuk menjadikan pembangunan API lebih mudah dan cekap. Salah satu ciri utama FastAPI ialah sokongannya untuk mengendalikan pelbagai jenis permintaan, termasuk permintaan POST dengan fail dan badan JSON.
Dalam artikel ini, kami akan meneroka cara mengendalikan kedua-dua fail dan badan JSON dalam permintaan FastAPI POST. Kami akan merangkumi kaedah yang berbeza dan menyediakan contoh kod untuk memudahkan pemahaman dan pelaksanaan. Mari mulakan!
Mengendalikan Fail dan JSON Body dalam FastAPI POST Request
Untuk mengendalikan fail dan badan JSON dalam permintaan FastAPI POST, anda boleh menggunakan kaedah berikut:
Menggunakan Borang dan Fail: Kaedah ini membolehkan anda mengisytiharkan berbilang parameter Borang dalam operasi laluan. Walau bagaimanapun, anda juga tidak boleh mengisytiharkan medan Badan yang anda jangkakan akan terima sebagai JSON kerana permintaan akan mempunyai badan dikodkan menggunakan application/x-www-form-urlencoded dan bukannya application/json (apabila borang termasuk fail, ia dikodkan sebagai berbilang bahagian /form-data).
Menggunakan Model dan Ketergantungan Pydantic: Anda boleh menggunakan model Pydantic untuk memaklumkan titik akhir bahawa pembolehubah parameter bergantung pada kelas Base. Anda boleh mentakrifkan parameter pertanyaan secara langsung dalam titik akhir seperti yang ditunjukkan dalam jawapan ini.
Melalui Data Badan sebagai Parameter Tunggal: Pilihan lain ialah menghantar data badan sebagai parameter tunggal (jenis Borang) dalam bentuk rentetan JSON. Untuk itu, anda perlu mencipta fungsi pergantungan pada bahagian pelayan.
Menggunakan Kelas Tersuai dengan Kaedah Kelas: Anda juga boleh menggabungkan kelas tersuai dengan kaedah kelas yang digunakan untuk mengubah rentetan JSON yang diberikan kepada Kamus Python, yang kemudiannya digunakan untuk pengesahan terhadap model Pydantic.
Menggunakan Fail Berkod Base64: Kaedah ini melibatkan penukaran bait fail ke dalam rentetan format base64 dan menambahkannya pada objek JSON, bersama-sama dengan data lain yang anda mungkin mahu hantar ke pelayan. Walau bagaimanapun, pendekatan ini tidak begitu disyorkan kerana saiz fail yang lebih besar dan sumber tambahan yang diperlukan untuk pengekodan dan penyahkodan.
Contoh Kod
Mari kita terokai beberapa contoh kod untuk menunjukkan cara mengendalikan fail dan badan JSON dalam permintaan FastAPI POST menggunakan kaedah berbeza:
Kaedah Menggunakan Borang dan Fail:
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})
Kaedah Menggunakan Model Pydantic dan Ketergantungan:
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})
Kaedah Menggunakan Kelas Tersuai dengan Kaedah Kelas:
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})
Dengan kaedah ini, anda mempunyai fleksibiliti untuk mengendalikan fail dan badan JSON dalam permintaan FastAPI POST mengikut keperluan khusus anda. Sama ada anda perlu mengesahkan data menggunakan model Pydantic atau hanya menerima rentetan JSON, terdapat penyelesaian yang sesuai tersedia.
Kesimpulan
Dalam artikel ini, kami telah meneroka pelbagai kaedah untuk mengendalikan kedua-dua fail dan badan JSON dalam permintaan FastAPI POST. Dengan menyediakan contoh kod dan penjelasan terperinci, kami telah menyasarkan untuk menjadikan pemahaman dan pelaksanaan kaedah ini semudah mungkin. Semasa anda membangunkan API anda, anda boleh memilih kaedah yang paling sesuai berdasarkan keperluan dan keutamaan anda.
Jika
Atas ialah kandungan terperinci Bagaimana Mengendalikan Fail dan Badan JSON Secara serentak dalam Permintaan POST FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!