Introdução ao Desenvolvimento Web

+ Framework Flask (Python)

Fundamentos da Web • Cliente-Servidor • HTML/CSS/JS • Roadmap • Flask hands-on

Fundamentos da Web

  • HTTP: protocolo de comunicação cliente ⟷ servidor
  • HTML: estrutura e conteúdo
  • CSS: estilo e layout
  • JavaScript: interatividade e DOM

HTTP (visão geral)

  • Métodos: GET, POST, PUT, DELETE…
  • Status: 200, 201, 400, 401, 404, 500…
  • Cabeçalhos (headers) e corpo (body)
  • Cookies, sessões e cache
GET /pagina HTTP/1.1
Host: exemplo.com
Accept: text/html

HTTP/1.1 200 OK
Content-Type: text/html

<html>...</html>

Cliente-Servidor

  • Cliente: navegador / app envia requisições
  • Servidor: processa e responde
  • Ciclo de requisição e resposta (stateless em HTTP)

Dica Entender requisições ajuda a debugar APIs e front-ends.

HTML

<!doctype html>
<html>
  <head><title>Minha Página</title></head>
  <body>
    <h1>Título</h1>
    <p>Parágrafo com <a href="#">link</a>.</p>
  </body>
</html>

CSS

body { font-family: Arial, sans-serif; }
h1 { color: #1f6feb; }
.card {
  border: 1px solid #ddd;
  padding: 1rem; border-radius: 8px;
}

JavaScript

document.querySelector("#btn").addEventListener("click", () => {
  const nome = document.querySelector("#nome").value;
  alert(`Olá, ${nome}!`);
});

DOM & Eventos

<input id="nome" placeholder="Seu nome" />
<button id="btn">Saudar</button>
<script>
// manipulação do DOM
const btn = document.getElementById("btn");
btn.onclick = () => {
  const nome = document.getElementById("nome").value.trim();
  console.log("Nome digitado:", nome);
};
</script>

Roadmap Sugerido

  • Fundamentos: HTML, CSS, JS
  • Arquitetura: Cliente-Servidor, HTTP
  • Frameworks: React/Angular/Vue no front • Flask/Django/FastAPI no back
  • Banco de dados: SQL (PostgreSQL/MySQL) e NoSQL (MongoDB, etc.)
  • Segurança: Autenticação, Autorização, OWASP Top 10

Front-end (exemplos)

  • React — UI declarativa, componentes
  • Angular — framework completo
  • Vue — progressivo e simples

Back-end (exemplos)

  • Node.js — JS no servidor
  • Python — Flask / Django / FastAPI
  • Java — Spring Boot

Bancos de Dados

  • SQL: PostgreSQL, MySQL — ACID, schemas
  • NoSQL: MongoDB, Cassandra — flexibilidade, escala
-- SQL de exemplo
CREATE TABLE contatos (
  id SERIAL PRIMARY KEY,
  nome TEXT NOT NULL,
  email TEXT NOT NULL UNIQUE
);

Segurança

  • Autenticação & Autorização (JWT, sessões)
  • OWASP Top 10 (XSS, SQLi, CSRF, etc.)
  • HTTPS, headers de segurança, validação de entrada

Segurança deve ser considerada desde o início do projeto.

Projeto: Agenda de Contatos (Flask)

Vamos criar uma aplicação simples para cadastrar e listar contatos.

  • Flask como servidor web
  • Templates Jinja2
  • HTML/CSS/JS no front

1) Ambiente

# criar e ativar venv
python -m venv .venv
# Linux/macOS
source .venv/bin/activate
# Windows
# .venv\Scripts\activate

pip install Flask

Mantenha as dependências isoladas por projeto.

2) app.py

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)
contatos: list[dict] = []  # usar DB em produção

@app.route("/")
def index():
    return render_template("index.html", contatos=contatos)

@app.route("/adicionar", methods=["POST"])
def adicionar_contato():
    contato = {
        "nome": request.form["nome"],
        "email": request.form["email"],
        "telefone": request.form["telefone"]
    }
    contatos.append(contato)
    return redirect(url_for("index"))

if __name__ == "__main__":
    app.run(debug=True)

3) templates/index.html

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="utf-8">
  <title>Minha Agenda</title>
  <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
  <h1>Minha Agenda</h1>

  <form method="POST" action="/adicionar" class="card">
    <input type="text" name="nome" placeholder="Nome" required />
    <input type="email" name="email" placeholder="Email" required />
    <input type="tel" name="telefone" placeholder="Telefone" required />
    <button type="submit">Adicionar</button>
  </form>

  <h2>Contatos</h2>
  <ul>
    {% for c in contatos %}
      <li>{{ c.nome }} — {{ c.email }} — {{ c.telefone }}</li>
    {% else %}
      <li>Sem contatos.</li>
    {% endfor %}
  </ul>
</body>
</html>

4) static/style.css

* { box-sizing: border-box; }
body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial;
       max-width: 820px; margin: 40px auto; padding: 0 16px; }
h1 { color: #1f6feb; }
.card { display: grid; gap: 8px; padding: 12px;
        border: 1px solid #ddd; border-radius: 10px; }
input, button { padding: 10px; border-radius: 8px; border: 1px solid #ccc; }
button { background: #1f6feb; color: white; border: none; cursor: pointer; }
button:hover { filter: brightness(1.05); }

5) Executando

python app.py
# acesse http://127.0.0.1:5000

Próximos passos: persistir em SQLite, validações de formulário, editar/excluir.

Estrutura de Pastas (Flask)

meu_projeto/
├─ app.py
├─ templates/
│  └─ index.html
├─ static/
│  └─ style.css
└─ .venv/

Convencional: templates/ para HTML (Jinja2) e static/ para CSS/JS/imagens.

Jinja2 (dicas)

<ul>
  {% for item in itens %}
    <li>{{ item.nome }}</li>
  {% endfor %}
</ul>

URL dinâmicas

@app.route("/contato/<int:cid>")
def detalhe(cid):
    # buscar contato por id
    ...

Formulários & Request

from flask import request

@app.post("/enviar")
def enviar():
    nome = request.form.get("nome")
    return f"Olá, {nome}!"

JSON & APIs

from flask import jsonify

@app.get("/api/contatos")
def api_contatos():
    return jsonify(contatos)

Boas Práticas

  • Separe camadas (rotas, serviços, repositórios)
  • Valide dados (WTForms, pydantic em APIs)
  • Use Blueprints para modularizar rotas
  • Config por ambiente (dev/stage/prod)

Blueprints (exemplo)

# contatos/rotas.py
from flask import Blueprint
bp = Blueprint("contatos", __name__)

@bp.get("/contatos")
def listar():
    return "listar..."

# app.py
from contatos.rotas import bp
app.register_blueprint(bp)

Deploy (visão geral)

  • WSGI server (gunicorn/uwsgi) + reverse proxy (nginx)
  • Variáveis de ambiente (SECRET_KEY, DB_URL)
  • Logs, monitoramento e backups
# exemplo simples
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app

Próximos Passos

  • Persistência (SQLAlchemy/SQLite/PostgreSQL)
  • Autenticação (Flask-Login / JWT em APIs)
  • Arquitetura REST / Blueprints / Tests (pytest)
  • Front-end reativo (React/Alpine/HTMX)

Recapitulando

  • HTTP, HTML, CSS, JS: base do desenvolvimento web
  • Cliente-Servidor: ciclo de requisição/resposta
  • Flask: rotas, templates, static, JSON
  • Projeto exemplo: Agenda de Contatos

Daqui, evolua para banco de dados, segurança e testes.