Se você já conhece o básico de Python e quer dar os primeiros passos no mundo web, o Flask é uma ótima porta de entrada. Ele é leve, simples e você consegue criar sua primeira API em poucos minutos.
Neste artigo vamos construir uma API de tarefas (a clássica todo list) usando JSON.
Preparando o ambiente
Antes de começar, crie um ambiente virtual (se tiver dúvidas, veja nosso artigo sobre ambientes virtuais) e instale o Flask:
python3 -m venv .venv
source .venv/bin/activate
pip install flask
Criando a aplicação
Crie um arquivo chamado app.py com o seguinte conteúdo:
from flask import Flask, jsonify, request
app = Flask(__name__)
tarefas = []
proximo_id = 1
@app.route("/tarefas", methods=["GET"])
def listar_tarefas():
return jsonify(tarefas)
if __name__ == "__main__":
app.run(debug=True)
Para rodar, execute:
python app.py
Acesse http://localhost:5000/tarefas no navegador. Você verá uma lista vazia []. Pronto, sua primeira API está no ar!
O que acabamos de fazer?
Vamos entender as peças desse código:
@app.route("/tarefas", methods=["GET"])registra uma rota: quando alguém acessar/tarefas, a função abaixo será executada.methods=["GET"]define o método HTTP aceito. OGETé usado para consultar informações.jsonifytransforma um objeto Python (como uma lista) em JSON, o formato usado para trocar dados entre aplicações.
Adicionando novas tarefas
Uma API não serve apenas para consultar, ela também deve permitir criar, atualizar e deletar informações. Para isso usamos os métodos HTTP:
| Método | Ação | URL |
|---|---|---|
| GET | listar tarefas | /tarefas |
| POST | criar uma nova tarefa | /tarefas |
| GET | ver uma tarefa específica | /tarefas/1 |
| PUT | atualizar uma tarefa | /tarefas/1 |
| DELETE | remover uma tarefa | /tarefas/1 |
Vamos adicionar a rota de criação:
@app.route("/tarefas", methods=["POST"])
def criar_tarefa():
global proximo_id
dados = request.get_json()
nova_tarefa = {
"id": proximo_id,
"titulo": dados.get("titulo", ""),
"concluida": False,
}
tarefas.append(nova_tarefa)
proximo_id += 1
return jsonify(nova_tarefa), 201
O 201 no return é o código HTTP de Created, indicando que o recurso foi criado com sucesso.
Testando com curl
Para enviar uma requisição POST com dados, usamos o curl no terminal:
curl -X POST http://localhost:5000/tarefas \
-H "Content-Type: application/json" \
-d '{"titulo": "Escrever artigo do blog"}'
Você deve receber como resposta:
{
"id": 1,
"titulo": "Escrever artigo do blog",
"concluida": false
}
Consultando e atualizando uma tarefa
Agora vamos implementar as rotas para uma tarefa específica:
def encontrar_tarefa(tarefa_id):
for tarefa in tarefas:
if tarefa["id"] == tarefa_id:
return tarefa
return None
@app.route("/tarefas/<int:tarefa_id>", methods=["GET"])
def ver_tarefa(tarefa_id):
tarefa = encontrar_tarefa(tarefa_id)
if tarefa is None:
return jsonify({"erro": "Tarefa não encontrada"}), 404
return jsonify(tarefa)
@app.route("/tarefas/<int:tarefa_id>", methods=["PUT"])
def atualizar_tarefa(tarefa_id):
tarefa = encontrar_tarefa(tarefa_id)
if tarefa is None:
return jsonify({"erro": "Tarefa não encontrada"}), 404
dados = request.get_json()
tarefa["titulo"] = dados.get("titulo", tarefa["titulo"])
tarefa["concluida"] = dados.get("concluida", tarefa["concluida"])
return jsonify(tarefa)
Note o uso de <int:tarefa_id> na rota: o Flask converte o trecho da URL em um inteiro e o passa como argumento para a função.
Para deletar, criamos a última rota:
@app.route("/tarefas/<int:tarefa_id>", methods=["DELETE"])
def deletar_tarefa(tarefa_id):
global tarefas
tarefas = [t for t in tarefas if t["id"] != tarefa_id]
return "", 204
O código 204 significa No Content: a operação funcionou, mas não há nada para retornar.
Teste completo da sua API
# criar duas tarefas
curl -X POST http://localhost:5000/tarefas -H "Content-Type: application/json" -d '{"titulo": "Estudar Flask"}'
curl -X POST http://localhost:5000/tarefas -H "Content-Type: application/json" -d '{"titulo": "Estudar Docker"}'
# listar todas
curl http://localhost:5000/tarefas
# atualizar a tarefa 1
curl -X PUT http://localhost:5000/tarefas/1 -H "Content-Type: application/json" -d '{"concluida": true}'
# deletar a tarefa 2
curl -X DELETE http://localhost:5000/tarefas/2
Próximos passos
A partir daqui o caminho é longo e divertido:
- Conectar a um banco de dados para os dados não se perderem ao reiniciar o servidor;
- Organizar o código em módulos e usar blueprints;
- Adicionar validação nos dados recebidos;
- Conhecer outros frameworks como o FastAPI e o Django.
O Flask é perfeito para começar, pois ele não impõe estrutura e deixa você aprender cada conceito aos poucos. Em breve traremos um artigo mostrando como integrar sua API a um banco de dados.
Gostou? Compartilhe com a comunidade e envie sua versão da API no nosso repositório.