Trabalhando com Formulários - 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
multipart/form-data
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
index.html
<!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
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
postdata
Validação de Dados
O FastAPI permite validar os valores do formulário usando argumentos no construtor do Form
: Define o número mínimo de caracteres para strings.min_length
: Define o número máximo de caracteres para strings.max_length
: Aplica uma expressão regular para validação.pattern
,lt
: Valida que o valor seja menor ou menor ou igual a um número.le
,gt
: Valida que o valor seja maior ou maior ou igual a um número.ge
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
userage
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
Form
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
userage
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
<!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
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
list