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

Данные формы

🌐 Перевод выполнен с помощью ИИ и людей

Этот перевод был сделан ИИ под руководством людей. 🤝

В нем могут быть ошибки из-за неправильного понимания оригинального смысла или неестественности и т. д. 🤖

Вы можете улучшить этот перевод, помогая нам лучше направлять ИИ LLM.

Английская версия

Когда вам нужно получить поля формы вместо JSON, вы можете использовать Form.

Дополнительная информация

Чтобы использовать формы, сначала установите python-multipart.

Убедитесь, что вы создали виртуальное окружение, активировали его, а затем установили пакет, например:

$ pip install python-multipart

Импорт Form

Импортируйте Form из fastapi:

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

Определение параметров Form

Создайте параметры формы так же, как это делается для Body или Query:

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

Например, в одном из способов использования спецификации OAuth2 (называемом «потоком пароля») требуется отправить username и password в виде полей формы.

spec требует, чтобы поля были строго названы username и password и отправлялись как поля формы, а не JSON.

С помощью Form вы можете объявить те же настройки, что и с BodyQuery, Path, Cookie), включая валидацию, примеры, псевдоним (например, user-name вместо username) и т.д.

Дополнительная информация

Form — это класс, который наследуется непосредственно от Body.

Подсказка

Чтобы объявлять данные формы, вам нужно явно использовать Form, иначе параметры будут интерпретированы как параметры запроса или параметры тела (JSON).

О «полях формы»

Обычно способ, которым HTML-формы (<form></form>) отправляют данные на сервер, использует «специальное» кодирование для этих данных, отличное от JSON.

FastAPI гарантирует, что эти данные будут прочитаны из нужного места, а не из JSON.

Технические детали

Данные из форм обычно кодируются с использованием «типа содержимого» application/x-www-form-urlencoded.

Но когда форма содержит файлы, она кодируется как multipart/form-data. О работе с файлами вы прочтёте в следующей главе.

Если вы хотите узнать больше про эти кодировки и поля формы, обратитесь к MDN веб-документации для POST.

Предупреждение

Вы можете объявлять несколько параметров Form в операции пути, но вы не можете одновременно объявлять поля Body, которые вы ожидаете получить в виде JSON, так как запрос будет иметь тело, закодированное с использованием application/x-www-form-urlencoded, а не application/json.

Это не ограничение FastAPI, это часть протокола HTTP.

Резюме

Используйте Form для объявления входных параметров данных формы.