Модели форм¶
Вы можете использовать Pydantic-модели для объявления полей форм в FastAPI.
Дополнительная информация
Чтобы использовать формы, сначала установите python-multipart
.
Убедитесь, что вы создали и активировали виртуальное окружение, а затем установите пакет, например:
$ pip install python-multipart
Заметка
Этот функционал доступен с версии 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-модель.
Проверка сгенерированной документации¶
Вы можете посмотреть поля формы в графическом интерфейсе Документации по пути /docs
:

Запрет дополнительных полей формы¶
В некоторых случаях (не особо часто встречающихся) вам может понадобиться ограничить поля формы только теми, которые объявлены в Pydantic-модели. И запретить любые дополнительные поля.
Заметка
Этот функционал доступен с версии 0.114.0
. 🤓
Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (forbid
) все дополнительные (extra
) поля:
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. 😎