如何在 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中文網其他相關文章!