表單資料¶
當您需要接收表單欄位而不是 JSON 時,您可以使用 Form
。
匯入 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
參數¶
以與 Body
或 Query
相同的方式建立表單參數
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 規範的一種使用方法(稱為「密碼流程」)中,需要以表單欄位形式傳送 username
和 password
。
該規格要求欄位名稱必須完全是 username
和 password
,並且以表單欄位形式傳送,而不是 JSON。
使用 Form
,您可以宣告與 Body
(以及 Query
、Path
、Cookie
)相同的配置,包括驗證、範例、別名(例如 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
宣告表單資料輸入參數。