Данные формы FastAPI

Когда клиент отправляет данные через HTML-форму (application/x-www-form-urlencoded) При отправке данных нужно использоватьFormдля получения полей формы, вместоBaseModel。


Установите python-multipart

Перед использованием функциональности форм необходимо установитьpython-multipart:

pip install python-multipart

Получение данных формы

ИспользованиеFormОбъявление полей формы

Пример

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(
    username: str = Form(),      # Обязательные поля формы
    password: str = Form(),      # Обязательные поля формы
):
    return {"username": username}


Разница между полями формы и телом JSON-запроса

Пункт сравненияТело JSON-запросаДанные формы
Content-Typeapplication/jsonapplication/x-www-form-urlencoded
Способ объявленияPydantic BaseModelForm()
Структуры данныхПоддерживает вложенные объекты и массивыПлоские пары ключ-значение
Применимые сценарииAPI-интерфейс (разделение фронтенда и бэкенда)Отправка HTML-формы

Данные формы отправляются как "поля", а не JSON. Поэтому вы не можетеFormобъявлять параметры как модели Pydantic. Поля формы и тело JSON-запроса нельзя использовать вместе в одном маршруте.


Необязательные поля формы

Как и параметры запроса, поля формы со значениями по умолчанию являются необязательными:

Пример

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/items/")
async def create_item(
    name: str = Form(...),                    # Обязательно
    description: str | None = Form(None),     # Необязательно, по умолчанию None
    price: float = Form(..., gt=0),           # Обязательно, должно быть больше 0
):
    return {"name": name, "description": description, "price": price}


Тестирование с помощью HTML-форм

Вы можете создать HTML-страницу для проверки отправки формы:

Пример

<form action="http://localhost:8000/items/" method="post">
    <label for="name">Название:</label>
    <input type="text" id="name" name="name" required>
    <br>
    <label for="description">Описание:</label>
    <textarea id="description" name="description"></textarea>
    <br>
    <label for="price">Цена:</label>
    <input type="number" id="price" name="price" required min="0">
    <br>
    <button type="submit">Отправить</button>
</форма>

Валидация и документирование данных формы

ИспользованиеFormДля объявленных полей FastAPI автоматически выполнит проверку данных и отобразит их в документации API:


Итог

  • ИспользованиеFormПолучение данных, отправленных из HTML-формы
  • Данные формы не являются JSON и не могут использоваться сBaseModelСмешивание тела запроса
  • Form()Объявление обязательных полейForm(None)Объявление необязательных полей
  • Требуется установкаpython-multipartПакет
  • Поля формы поддерживают те же правила проверки, что и параметры запроса (min_length、gtи т.д.)
Другие расширения