Данные формы¶
Когда вам нужно получить поля формы вместо 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}
from fastapi import FastAPI, Form
from typing_extensions import Annotated
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
Подсказка
Рекомендуется использовать 'Annotated' версию, если это возможно.
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}
from fastapi import FastAPI, Form
from typing_extensions import Annotated
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
Подсказка
Рекомендуется использовать 'Annotated' версию, если это возможно.
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 в виде полей формы.
Данный способ требует отправку данных для авторизации посредством формы (а не JSON) и обязательного наличия в форме строго именованных полей username и password.
Вы можете настроить Form точно так же, как настраиваете и Body ( Query, 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 для объявления входных параметров данных формы.