跳至內容

表單資料

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

資訊

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

請確保您建立一個 虛擬環境,啟動它,然後安裝它,例如

$ pip install python-multipart

匯入 Form

fastapi 匯入 Form

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
from fastapi import FastAPI, Form
from typing_extensions import Annotated

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}

提示

如果可能,建議使用 Annotated 版本。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

定義 Form 參數

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

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
from fastapi import FastAPI, Form
from typing_extensions import Annotated

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}

提示

如果可能,建議使用 Annotated 版本。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

例如,在 OAuth2 規範的一種使用方法(稱為「密碼流程」)中,需要以表單欄位形式傳送 usernamepassword

規格要求欄位名稱必須完全是 usernamepassword,並且以表單欄位形式傳送,而不是 JSON。

使用 Form,您可以宣告與 Body(以及 QueryPathCookie)相同的配置,包括驗證、範例、別名(例如 user-name 而不是 username)等。

資訊

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

提示

要宣告表單主體,您需要明確使用 Form,因為如果不使用它,參數將被解釋為查詢參數或主體 (JSON) 參數。

關於「表單欄位」

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

FastAPI 將確保從正確的位置讀取資料,而不是 JSON。

「技術細節」

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

但是,當表單包含檔案時,它會被編碼為 multipart/form-data。您將在下一章中閱讀有關處理檔案的內容。

如果您想進一步了解這些編碼和表單欄位,請前往 MDN 網頁文件,了解 POST

警告

您可以在一個路徑操作中宣告多個 Form 參數,但您不能同時宣告預期以 JSON 接收的 Body 欄位,因為請求的主體將使用 application/x-www-form-urlencoded 而不是 application/json 進行編碼。

這不是 FastAPI 的限制,它是 HTTP 協定的一部分。

摘要

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