Перейти до змісту

Дані форми

Якщо Вам потрібно отримувати поля форми замість 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 (так званий "password flow") вимагає надсилати 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 для оголошення вхідних параметрів у вигляді даних форми.