Перейти до змісту

Моделі форм (Form Models)

У FastAPI Ви можете використовувати Pydantic-моделі для оголошення полів форми.

Інформація

Щоб використовувати форми, спочатку встановіть 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-моделі, щоб заборонити 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. 😎