Modelos de Formulários¶
Você pode utilizar Modelos Pydantic para declarar campos de formulários no FastAPI.
"Informação"
Para utilizar formulários, instale primeiramente o python-multipart
.
Certifique-se de criar um ambiente virtual, ativá-lo, e então instalar. Por exemplo:
$ pip install python-multipart
"Nota"
Isto é suportado desde a versão 0.113.0
do FastAPI. 🤓
Modelos Pydantic para Formulários¶
Você precisa apenas declarar um modelo Pydantic com os campos que deseja receber como campos de formulários, e então declarar o parâmetro como um Form
:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
"Dica"
Prefira utilizar a versão Annotated
se possível.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: FormData = Form()):
return data
O FastAPI irá extrair as informações para cada campo dos dados do formulário na requisição e dar para você o modelo Pydantic que você definiu.
Confira os Documentos¶
Você pode verificar na UI de documentação em /docs
:
Proibir Campos Extras de Formulários¶
Em alguns casos de uso especiais (provavelmente não muito comum), você pode desejar restringir os campos do formulário para aceitar apenas os declarados no modelo Pydantic. E proibir qualquer campo extra.
"Nota"
Isso é suportado deste a versão 0.114.0
do FastAPI. 🤓
Você pode utilizar a configuração de modelo do Pydantic para proibir
qualquer campo extra
:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
Tip
Prefira utilizar a versão Annotated
se possível.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: FormData = Form()):
return data
Caso um cliente tente enviar informações adicionais, ele receberá um retorno de erro.
Por exemplo, se o cliente tentar enviar os campos de formulário:
username
:Rick
password
:Portal Gun
extra
:Mr. Poopybutthole
Ele receberá um retorno de erro informando-o que o campo extra
não é permitido:
{
"detail": [
{
"type": "extra_forbidden",
"loc": ["body", "extra"],
"msg": "Extra inputs are not permitted",
"input": "Mr. Poopybutthole"
}
]
}
Resumo¶
Você pode utilizar modelos Pydantic para declarar campos de formulários no FastAPI. 😎