폼 모델¶
FastAPI에서 Pydantic 모델을 이용하여 폼 필드를 선언할 수 있습니다.
정보
폼(Form)을 사용하려면, 먼저 python-multipart
를 설치하세요.
가상 환경을 생성하고 활성화한 다음, 아래와 같이 설치할 수 있습니다:
$ pip install python-multipart
참고
이 기능은 FastAPI 버전 0.113.0
이후부터 지원됩니다. 🤓
Pydantic 모델을 사용한 폼¶
폼 필드로 받고 싶은 필드를 Pydantic 모델로 선언한 다음, 매개변수를 Form
으로 선언하면 됩니다:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
🤓 Other versions and variants
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
Tip
Prefer to use the Annotated
version if possible.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: FormData = Form()):
return data
FastAPI는 요청에서 받은 폼 데이터에서 각 필드에 대한 데이터를 추출하고 정의한 Pydantic 모델을 줍니다.
문서 확인하기¶
문서 UI /docs
에서 확인할 수 있습니다:
추가 폼 필드 금지하기¶
일부 특별한 사용 사례(흔하지는 않겠지만)에서는 Pydantic 모델에서 정의한 폼 필드를 제한하길 원할 수도 있습니다. 그리고 추가 필드를 금지할 수도 있습니다.
참고
이 기능은 FastAPI 버전 0.114.0
이후부터 지원됩니다. 🤓
Pydantic의 모델 구성을 사용하여 추가(extra
) 필드를 금지(forbid
)할 수 있습니다:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
🤓 Other versions and variants
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
Tip
Prefer to use the Annotated
version if possible.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: FormData = Form()):
return data
클라이언트가 추가 데이터를 보내려고 하면 오류 응답을 받게 됩니다.
예를 들어, 클라이언트가 폼 필드를 보내려고 하면:
username
:Rick
password
:Portal Gun
extra
:Mr. Poopybutthole
extra
필드가 허용되지 않는다는 오류 응답을 받게 됩니다:
{
"detail": [
{
"type": "extra_forbidden",
"loc": ["body", "extra"],
"msg": "Extra inputs are not permitted",
"input": "Mr. Poopybutthole"
}
]
}
요약¶
Pydantic 모델을 사용하여 FastAPI에서 폼 필드를 선언할 수 있습니다. 😎