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

Модели форм

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

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

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

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

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

Вы можете использовать Pydantic-модели для объявления полей формы в FastAPI.

Заметка

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

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

$ pipinstallpython-multipart

Заметка

Этот функционал доступен начиная с версии FastAPI 0.113.0. 🤓

Pydantic-модели для форм

Вам просто нужно объявить Pydantic-модель с полями, которые вы хотите получить как поля формы, а затем объявить параметр как Form:

fromtypingimport Annotated
fromfastapiimport FastAPI, Form
frompydanticimport BaseModel
app = FastAPI()
classFormData(BaseModel):
 username: str
 password: str
@app.post("/login/")
async deflogin(data: Annotated[FormData, Form()]):
 return data
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

fromfastapiimport FastAPI, Form
frompydanticimport BaseModel
app = FastAPI()
classFormData(BaseModel):
 username: str
 password: str
@app.post("/login/")
async deflogin(data: FormData = Form()):
 return data

FastAPI извлечёт данные для каждого поля из данных формы в запросе и выдаст вам объявленную Pydantic-модель.

Проверьте документацию

Вы можете проверить это в интерфейсе документации по адресу /docs:

Запрет дополнительных полей формы

В некоторых случаях (не особо часто встречающихся) вам может понадобиться ограничить поля формы только теми, которые объявлены в Pydantic-модели. И запретить любые дополнительные поля.

Заметка

Этот функционал доступен начиная с версии FastAPI 0.114.0. 🤓

Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (forbid) все дополнительные (extra) поля:

fromtypingimport Annotated
fromfastapiimport FastAPI, Form
frompydanticimport BaseModel
app = FastAPI()
classFormData(BaseModel):
 username: str
 password: str
 model_config = {"extra": "forbid"}
@app.post("/login/")
async deflogin(data: Annotated[FormData, Form()]):
 return data
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

fromfastapiimport FastAPI, Form
frompydanticimport BaseModel
app = FastAPI()
classFormData(BaseModel):
 username: str
 password: str
 model_config = {"extra": "forbid"}
@app.post("/login/")
async deflogin(data: FormData = Form()):
 return data

Если клиент попробует отправить дополнительные данные, то в ответ он получит ошибку.

Например, если клиент попытается отправить поля формы:

  • username: Rick
  • password: Portal Gun
  • extra: Mr. Poopybutthole

То в ответ он получит ошибку, сообщающую ему, что поле extra не разрешено:

{
"detail":[
{
"type":"extra_forbidden",
"loc":["body","extra"],
"msg":"Extra inputs are not permitted",
"input":"Mr. Poopybutthole"
}
]
}

Итоги

Вы можете использовать Pydantic-модели для объявления полей форм в FastAPI. 😎

AltStyle によって変換されたページ (->オリジナル) /