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