Данные формы 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}
app = FastAPI()
@app.post("/login/")
async def login(
username: str = Form(), # Обязательные поля формы
password: str = Form(), # Обязательные поля формы
):
return {"username": username}

Разница между полями формы и телом JSON-запроса
| Пункт сравнения | Тело JSON-запроса | Данные формы |
|---|---|---|
| Content-Type | application/json | application/x-www-form-urlencoded |
| Способ объявления | Pydantic BaseModel | Form() |
| Структуры данных | Поддерживает вложенные объекты и массивы | Плоские пары ключ-значение |
| Применимые сценарии | 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}
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>
</форма>
<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и т.д.)