Trabalhando com Formulários em FastAPI
No FastAPI, o processamento de dados de formulários HTML é diferente do tratamento de dados enviados no corpo da requisição. Para manipular formulários, é necessário instalar o módulo python-multipart
, que lida com os dados enviados no formato multipart/form-data
. Você pode instalá-lo usando o comando:
pip install python-multipart
O FastAPI fornece o objeto Form para acessar os dados enviados por formulários. Vamos criar um exemplo para entender como isso funciona.
Vamos criar a seguinte estrutura de diretórios:
. ├── public │ └── index.html ├── main.py
No diretório public
, crie um arquivo chamado index.html
com o seguinte conteúdo:
<!DOCTYPE html>
<html>
<head>
<title>Exemplo de Formulário</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Formulário de Entrada</h2>
<form action="postdata" method="post">
<p>
Nome:<br />
<input name="username" />
</p>
<p>
Idade:<br />
<input name="userage" type="number" />
</p>
<input type="submit" value="Enviar" />
</form>
</body>
</html>
Esse formulário possui dois campos: nome e idade. Ao clicar no botão "Enviar", os dados serão enviados via requisição POST para o endpoint /postdata
.
Agora, vamos criar o arquivo main.py
com o seguinte código:
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html")
@app.post("/postdata")
def postdata(username: str = Form(), userage: int = Form()):
return {"name": username, "age": userage}
Nesse código, importamos a classe Form
do FastAPI e a utilizamos como tipo dos parâmetros da função postdata
. Dessa forma, o FastAPI irá automaticamente extrair os dados enviados pelo formulário e passá-los como argumentos para a função.
Validação de Dados
O FastAPI permite validar os valores do formulário usando argumentos no construtor do Form
. Estes são os principais parâmetros disponíveis:
min_length
: Define o número mínimo de caracteres para strings.max_length
: Define o número máximo de caracteres para strings.pattern
: Aplica uma expressão regular para validação.lt
,le
: Valida que o valor seja menor ou menor ou igual a um número.gt
,ge
: Valida que o valor seja maior ou maior ou igual a um número.
Vamos criar um exemplo para validar os dados do formulário:
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html")
@app.post("/postdata")
def postdata(
username: str = Form(min_length=2, max_length=20),
userage: int = Form(ge=18, lt=111)
):
return {"name": username, "age": userage}
Nesse exemplo, definimos que o campo username
deve ter entre 2 e 20 caracteres, e o campo userage
deve ser maior ou igual a 18 e menor que 111 (exclusivo)
Caso os dados do formulário não atendam a essas restrições, o FastAPI retornará automaticamente um erro detalhado.
Valores Padrão
Você pode definir valores padrão para os campos do formulário usando o argumento default
do Form
. Esses valores serão usados caso o campo correspondente esteja ausente na requisição.
Vamos criar um exemplo com valores padrão para os campos do formulário:
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html")
@app.post("/postdata")
def postdata(
username: str = Form(default="Undefined", min_length=2, max_length=20),
userage: int = Form(default=18, ge=18, lt=111)
):
return {"name": username, "age": userage}
Nesse exemplo, se o campo username
não estiver presente na requisição, ele será definido como "Undefined". Já o campo userage
terá o valor padrão de 18.
Enviando Listas
Formulários podem conter múltiplos campos com o mesmo nome, permitindo o envio de listas de valores. Por exemplo, editamos o arquivo index.html
para o seguinte conteúdo:
<!DOCTYPE html>
<html>
<head>
<title>Exemplo de Formulário</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Formulário de Entrada</h2>
<form action="postdata" method="post">
<p>
Nome:<br />
<input name="username" />
</p>
<p>
Linguagens de Programação:<br />
<input name="languages" /><br />
<input name="languages" /><br />
<input name="languages" /><br />
</p>
<input type="submit" value="Enviar" />
</form>
</body>
</html>
Neste exemplo, vários campos de entrada compartilham o mesmo atributo name
: languages
. Isso cria um conjunto de valores quando o formulário é enviado.
Agora editamos o arquivo main.py
:
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html")
@app.post("/postdata")
def postdata(
username: str = Form(),
languages: list = Form()
):
return {"name": username, "languages": languages}
Neste exemplo, o parâmetro languages
é definido como uma lista usando o tipo list
. Isso permite capturar múltiplos valores enviados no formulário. Vale ressaltar que mesmo que alguns campos estejam vazios, eles serão incluídos como strings vazias na lista.
Documentação oficial: