o prijeto completo esta no meu github
todo-app-with-fastapi-and-react
Este projeto é um experimento para demonstrar como integrar FastAPI, Jinja2 e JSX em uma aplicação web simples. A aplicação resultante é uma lista de tarefas (to-do list) interativa, onde os usuários podem adicionar e remover tarefas.
Nota: Este é um projeto experimental de teste, destinado a fins educacionais e de demonstração.
Índice
- Introdução
- Visão Geral do Projeto
- Tecnologias Utilizadas
- Estrutura do Projeto
- Instalação
- Executando a Aplicação
- Uso
- Explicação do Código
- Considerações Finais
Introdução
Este projeto tem como objetivo mostrar a potencialidade da integração entre o FastAPI (um framework web rápido e moderno para construir APIs com Python), Jinja2 (um motor de templates para renderizar HTML no lado do servidor) e JSX (uma extensão de sintaxe para JavaScript que facilita a escrita de componentes React).
Visão Geral do Projeto
A aplicação é uma lista de tarefas simples que permite:
- Adicionar Tarefas: Os usuários podem adicionar novas tarefas à lista.
- Remover Tarefas: Cada tarefa possui um botão "Done" que, ao ser clicado, remove a tarefa da lista.
- Interatividade em Tempo Real: A interface é atualizada em tempo real usando React com JSX.
Tecnologias Utilizadas
- Python 3.6+
- FastAPI
- Jinja2
- React (com JSX)
- Babel (para transpilar JSX no navegador)
- HTML/CSS
- JavaScript
Estrutura do Projeto
- main.py
- templates/
- index.html
- static/
- app.js
- styles.css
Instalação
Clone o repositório ou copie os arquivos para o seu ambiente local.
Crie um ambiente virtual e instale as dependências:
# Criar o ambiente virtual
python -m venv venv
# Ativar o ambiente virtual
# No Linux/macOS:
source venv/bin/activate
# No Windows:
venv\Scripts\activate
# Instalar as dependências
pip install fastapi uvicorn jinja2 aiofiles python-multipart
Executando a Aplicação
- Inicie o servidor FastAPI:
uvicorn main:app --reload
- Acesse a aplicação no seu navegador:
Abra http://127.0.0.1:8000/
no seu navegador preferido.
Uso
-
Adicionar uma Tarefa:
- Digite a descrição da tarefa no campo de entrada.
- Clique no botão "Adicionar" ou pressione "Enter".
-
Remover uma Tarefa:
- Clique no botão "Done" ao lado da tarefa que deseja remover.
Explicação do Código
Backend (main.py
)
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
import uuid
app = FastAPI()
templates = Jinja2Templates(directory="templates")
# Montar a pasta static para servir arquivos estáticos
app.mount("/static", StaticFiles(directory="static"), name="static")
# Modelo de Tarefa
class Task(BaseModel):
id: str
text: str
# Lista de tarefas em memória
tasks = []
@app.get("/", response_class=HTMLResponse)
async def read_index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.get("/api/tasks")
async def get_tasks():
return tasks
@app.post("/api/tasks")
async def add_task(task: Task):
tasks.append(task)
return {"message": "Tarefa adicionada com sucesso!"}
@app.delete("/api/tasks/{task_id}")
async def delete_task(task_id: str):
global tasks
tasks = [task for task in tasks if task.id != task_id]
return {"message": "Tarefa removida com sucesso!"}
Descrição:
-
Servindo Arquivos Estáticos: Usamos
StaticFiles
para servir CSS e JavaScript da pastastatic
. -
Modelo
Task
: Define o modelo de dados para uma tarefa, incluindoid
etext
. -
Endpoints:
-
GET /
: Renderiza a página inicial usando um template Jinja2. -
GET /api/tasks
: Retorna a lista de tarefas em formato JSON. -
POST /api/tasks
: Adiciona uma nova tarefa à lista. -
DELETE /api/tasks/{task_id}
: Remove uma tarefa peloid
.
-
Frontend (app.js
)
function App() {
const [tasks, setTasks] = React.useState([]);
const [taskText, setTaskText] = React.useState("");
React.useEffect(() => {
fetch("/api/tasks")
.then(response => response.json())
.then(data => setTasks(data));
}, []);
const addTask = (e) => {
e.preventDefault();
if (taskText.trim() === "") return;
const newTask = { id: uuidv4(), text: taskText };
fetch("/api/tasks", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(newTask)
})
.then(response => response.json())
.then(() => {
setTasks([...tasks, newTask]);
setTaskText("");
});
};
const deleteTask = (id) => {
fetch(`/api/tasks/${id}`, {
method: "DELETE",
})
.then(response => response.json())
.then(() => {
setTasks(tasks.filter(task => task.id !== id));
});
};
return (
<div>
<form onSubmit={addTask}>
<input
type="text"
value={taskText}
onChange={(e) => setTaskText(e.target.value)}
placeholder="Adicione uma nova tarefa"
/>
<button type="submit">Adicionar</button>
</form>
<ul>
{tasks.map((task) => (
<li key={task.id}>
{task.text}
<button onClick={() => deleteTask(task.id)}>Done</button>
</li>
))}
</ul>
</div>
);
}
// Função para gerar IDs únicos no frontend
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
ReactDOM.render(<App />, document.getElementById('root'));
Descrição:
-
Estado e Efeitos:
-
tasks
: Armazena a lista de tarefas. -
taskText
: Armazena o texto da nova tarefa. -
useEffect
: Busca as tarefas existentes ao montar o componente.
-
-
Funções:
-
addTask
: Adiciona uma nova tarefa enviando uma requisiçãoPOST
ao backend. -
deleteTask
: Remove uma tarefa enviando uma requisiçãoDELETE
ao backend.
-
-
Renderização:
- Formulário para adicionar novas tarefas.
- Lista de tarefas com botão "Done" para cada tarefa.
Template Jinja2 (index.html
)
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<title>Lista de Tarefas</title>
<link rel="stylesheet" href="/static/styles.css">
</head>
<body>
<h1>Minha Lista de Tarefas</h1>
<div id="root"></div>
<!-- Importar React e ReactDOM -->
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<!-- Babel para transpilar JSX no navegador -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<!-- Seu código JSX -->
<script type="text/babel" src="/static/app.js"></script>
</body>
</html>
Descrição:
-
Estrutura Básica: Contém o elemento
<div id="root"></div>
onde o React renderiza a aplicação. -
Importações:
- React e ReactDOM para criar a interface do usuário.
- Babel para transpilar JSX em JavaScript no navegador.
-
Scripts:
- Carrega o código JSX de
app.js
.
- Carrega o código JSX de
Estilos CSS (styles.css
)
body {
font-family: Arial, sans-serif;
margin: 20px;
}
h1 {
color: #333;
}
form {
margin-bottom: 20px;
}
input[type="text"] {
padding: 10px;
width: 300px;
margin-right: 10px;
}
button {
padding: 10px 15px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: flex;
justify-content: space-between;
align-items: center;
background: #f4f4f4;
margin-bottom: 5px;
padding: 10px;
}
button:hover {
background-color: #ddd;
cursor: pointer;
}
Descrição:
- Estilização Geral: Define fontes, cores e margens para uma aparência limpa.
- Formulário e Entradas: Estiliza o formulário de adição de tarefas.
- Lista de Tarefas: Estiliza a lista e os itens para melhor visualização.
- Botão "Done": Adiciona estilos para o botão de remoção de tarefas.
Considerações Finais
Este projeto demonstra como combinar FastAPI, Jinja2 e JSX para criar uma aplicação web interativa e moderna. Embora seja um experimento de teste, ele fornece uma base sólida para entender como essas tecnologias podem trabalhar juntas.
Pontos Importantes:
- Integração de Tecnologias: O FastAPI serve a aplicação e fornece endpoints de API, o Jinja2 renderiza o template inicial, e o React (com JSX) gerencia a interface do usuário.
-
Comunicação Frontend-Backend: A aplicação React se comunica com o backend usando
fetch
para realizar operações CRUD. - Estado e Atualização Dinâmica: O uso de React permite que a interface reflita mudanças de estado em tempo real.
Possíveis Extensões:
- Persistência de Dados: Integrar um banco de dados para armazenar tarefas de forma persistente.
- Autenticação e Autorização: Adicionar login de usuário para listas de tarefas personalizadas.
- Melhorias na Interface: Implementar feedback visual, validação de entradas e estilos aprimorados.
- Processo de Build do Frontend: Utilizar ferramentas como Webpack ou Parcel para transpilar e empacotar o código JSX para produção.
Nota Final: Este projeto é um experimento para fins educacionais. Em aplicações de produção, recomenda-se seguir as melhores práticas de segurança, desempenho e manutenção de código.
Espero que este projeto sirva como um ponto de partida útil para entender e explorar a integração entre FastAPI, Jinja2 e JSX em aplicações web.
Top comments (0)