Back to Fastapi

表單資料 { #form-data }

docs/zh-hant/docs/tutorial/request-forms.md

0.137.22.5 KB
Original Source

表單資料 { #form-data }

當你需要接收表單欄位而不是 JSON 時,可以使用 Form

/// note

要使用表單,請先安裝 python-multipart

請先建立並啟用一個虛擬環境,然後再安裝,例如:

console
$ pip install python-multipart

///

匯入 Form { #import-form }

fastapi 匯入 Form

{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *}

定義 Form 參數 { #define-form-parameters }

以與 BodyQuery 相同的方式建立表單參數:

{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}

例如,在 OAuth2 規範的一種用法(稱為「password flow」)中,必須以表單欄位傳送 usernamepassword

<dfn title="規範">規範</dfn> 要求欄位名稱必須正好是 usernamepassword,而且必須以表單欄位傳送,而不是 JSON。

使用 Form 時,你可以宣告與 Body(以及 QueryPathCookie)相同的設定,包括驗證、範例、別名(例如用 user-name 取代 username)等。

/// note

Form 是一個直接繼承自 Body 的類別。

///

/// tip

要宣告表單的請求本文,你需要明確使用 Form,否則這些參數會被解讀為查詢參數或請求本文(JSON)參數。

///

關於「表單欄位」 { #about-form-fields }

HTML 表單(<form></form>)向伺服器傳送資料時,通常會使用一種「特殊」的編碼方式,與 JSON 不同。

FastAPI 會從正確的位置讀取那些資料,而不是從 JSON。

/// note | 技術細節

表單資料通常會使用「媒體類型」application/x-www-form-urlencoded 進行編碼。

但當表單包含檔案時,會使用 multipart/form-data。你會在下一章閱讀如何處理檔案。

若想進一步了解這些編碼與表單欄位,請參考 <abbr title="Mozilla Developer Network - Mozilla 開發者網路">MDN</abbr> web docs 的 POST

///

/// warning

你可以在一個 路徑操作(path operation) 中宣告多個 Form 參數,但不能同時再宣告期望以 JSON 接收的 Body 欄位,因為該請求的本文會使用 application/x-www-form-urlencoded 編碼,而不是 application/json

這不是 FastAPI 的限制,而是 HTTP 協定本身的規定。

///

回顧 { #recap }

使用 Form 來宣告表單資料的輸入參數。