Перейти к содержанию

Модели форм

Вы можете использовать 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. 😎