Данные формы¶
Когда вам нужно получить поля формы вместо 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
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}
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
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}
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
вы можете объявить те же настройки, что и с 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
для объявления входных параметров данных формы.