python flask web HTTP jinja2 framework

Flask: creare web app con Python

Obiettivi della pillolona

Alla fine di questa pillolona saprai:

  • comprendere come funziona un’app web e il ruolo di Flask;
  • creare un server locale con route e funzioni associate;
  • gestire richieste GET e POST;
  • utilizzare i template HTML con Jinja2;
  • gestire form, cookies e sessioni;
  • strutturare correttamente una mini-applicazione Flask.

Cos’è Flask

Flask è un micro-framework web per Python: leggero, flessibile e ideale per imparare come funzionano le applicazioni web. Non impone una struttura rigida e ti permette di aggiungere solo ciò che serve.

Nota: Flask si basa su due componenti principali:

  • Werkzeug – gestisce le richieste e le risposte HTTP;
  • Jinja2 – motore di template per generare pagine HTML dinamiche.

Installazione e primo esempio

Installa Flask con:

pip install flask

Crea un file app.py:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Ciao dal server Flask!"

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

Esegui con: python app.py → apri il browser su http://127.0.0.1:5000

Route e metodi HTTP

Ogni route è una funzione Python associata a un URL.

@app.route("/info")
def info():
    return "<h2>Informazioni sul server</h2>"

@app.route("/saluta/<nome>")
def saluta(nome):
    return f"Ciao, {nome}!"

Puoi specificare metodi HTTP:

@app.route("/dati", methods=["GET", "POST"])
def dati():
    if request.method == "POST":
        return "Hai inviato dati!"
    else:
        return "Pagina di consultazione dati"

Template HTML con Jinja2

Crea una cartella templates/ e aggiungi un file index.html:

<!DOCTYPE html>
<html lang="it">
  <head><meta charset="UTF-8"><title>Benvenuto</title></head>
  <body>
    <h1>Ciao, {{ nome }}</h1>
  </body>
</html>

Nel file Python:

from flask import render_template

@app.route("/pagina/<nome>")
def pagina(nome):
    return render_template("index.html", nome=nome)

Form e richieste POST

from flask import request

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        utente = request.form["utente"]
        return f"Benvenuto, {utente}!"
    return '''
        <form method="POST">
            Nome utente: <input name="utente">
            <input type="submit" value="Entra">
        </form>
    '''

Redirect e messaggi flash

Puoi reindirizzare l’utente e mostrare messaggi temporanei:

from flask import redirect, url_for, flash

app.secret_key = "chiave_segreta"

@app.route("/start")
def start():
    flash("Accesso eseguito con successo!")
    return redirect(url_for("home"))

Nel template:

{% with messages = get_flashed_messages() %}
  {% for msg in messages %}
    <p style="color:green">{{ msg }}</p>
  {% endfor %}
{% endwith %}

Static files e struttura del progetto

Flask cerca automaticamente i file statici nella cartella static/ (es. immagini, CSS, JavaScript).

progetto/
 |-- app.py
 |-- templates/
 |   |-- index.html
 |-- static/
      |-- style.css

Sessioni e Cookies

Le sessioni permettono di salvare informazioni lato server tra più richieste.

from flask import session

app.secret_key = "supersegreta"

@app.route("/imposta/<utente>")
def imposta(utente):
    session["utente"] = utente
    return f"Sessione impostata per {utente}"

@app.route("/chi")
def chi():
    if "utente" in session:
        return f"Utente attivo: {session['utente']}"
    return "Nessuna sessione attiva"

Mini progetto finale: login e saluto

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

app = Flask(__name__)
app.secret_key = "flaskpillolona"

@app.route("/", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        nome = request.form["nome"]
        session["utente"] = nome
        return redirect(url_for("home"))
    return render_template("login.html")

@app.route("/home")
def home():
    if "utente" not in session:
        return redirect(url_for("login"))
    return render_template("home.html", nome=session["utente"])

@app.route("/logout")
def logout():
    session.pop("utente", None)
    return redirect(url_for("login"))

login.html:

<form method="POST">
  <input name="nome" placeholder="Nome utente">
  <button type="submit">Accedi</button>
</form>

home.html:

<h2>Ciao {{ nome }}!</h2>
<a href="{{ url_for('logout') }}">Esci</a>

Richieste POST con dati JSON e Query Parameter

Oltre ai form HTML, Flask permette di ricevere e inviare dati in formato JSON o tramite parametri URL.

Ricevere dati in JSON

Quando un client invia una richiesta con Content-Type: application/json, Flask permette di leggere il corpo tramite request.get_json().

from flask import jsonify

@app.route("/api/dati", methods=["POST"])
def ricevi_json():
    dati = request.get_json()
    nome = dati.get("nome")
    voto = dati.get("voto")
    return jsonify({
        "messaggio": f"Dati ricevuti per {nome}",
        "media": (voto + 10) / 2
    })

Nota: Puoi testarlo da terminale con:

curl -X POST -H "Content-Type: application/json" \
-d '{"nome": "Luca", "voto": 8}' \
http://127.0.0.1:5000/api/dati

Parametri nella Query String

I parametri nella query URL (es. ?utente=Mario&punteggio=90) si leggono tramite request.args.

@app.route("/punteggio")
def punteggio():
    utente = request.args.get("utente", "Anonimo")
    punti = request.args.get("punteggio", 0, type=int)
    return f"{utente} ha totalizzato {punti} punti!"

Nota: Esempio: http://127.0.0.1:5000/punteggio?utente=Luca&punteggio=95

Gestione dei Cookies lato server

I cookies permettono di salvare piccole informazioni nel browser dell’utente.

from flask import make_response

@app.route("/set_cookie")
def set_cookie():
    resp = make_response("Cookie impostato!")
    resp.set_cookie("utente", "Giulia", max_age=60*60*24)  # valido 1 giorno
    return resp
@app.route("/get_cookie")
def get_cookie():
    utente = request.cookies.get("utente")
    if utente:
        return f"Ciao di nuovo, {utente}!"
    return "Nessun cookie trovato."
@app.route("/del_cookie")
def del_cookie():
    resp = make_response("Cookie eliminato.")
    resp.delete_cookie("utente")
    return resp

Nota: I cookies sono gestiti dal browser e vengono inviati automaticamente in ogni richiesta allo stesso dominio, rendendo possibile mantenere sessioni o preferenze dell’utente.


In breve: Flask è uno strumento potente e accessibile per creare web app dinamiche con Python. Con pochi file puoi realizzare API, dashboard e applicazioni complete, integrando HTML, CSS e database.