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
GETePOST; - 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.
Impostare un Cookie
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
Leggere un Cookie
@app.route("/get_cookie")
def get_cookie():
utente = request.cookies.get("utente")
if utente:
return f"Ciao di nuovo, {utente}!"
return "Nessun cookie trovato."
Eliminare un Cookie
@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.
EC