Setup, primi passi e routing
Flask è un pacchetto disponibile su PyPi come tanti altri prima d’ora. Per gestire un progetto con Flask, andremo ad esplorare un approccio alternativo: Il problema è che le applicazioni Flask eseguite con Thonny non funzionano (sempre) bene!: Thonny cerca di gestire da solo l’esecuzione di Flask, ma non sempre è in grado di gestire tutto quanto accade, generando a volte errori più fastidiosi di quelli che riusciamo a combinare da soli!!!
Vediamo come fare, in maniera molto semplice:
Da Thonny, vai su Strumenti —> Apri shell di sistema e sul terminale digita:
pip install flask
Lascia aperto quel terminale e ogni volta che vuoi eseguire l’applicazione Flask, digita:
python nome_file_principale.py
Tutto qui!
La prima applicazione
Crea un file chiamato app.py nella cartella del progetto e scrivi questo codice:
from flask import Flask
# Crea l'applicazione Flask
app = Flask(__name__)
# Definisce la route principale
@app.route('/')
def home():
return 'Ciao, Flask!'
# Avvia il server
if __name__ == '__main__':
app.run(debug=True)
Tip
La funzione
app.run()ha diversi parametri opzionali:
debug=True: abilita il debug mode, che mostra in console errori dettagliati (default:False).port=<porta>: specifica la porta su cui il server deve ascoltare (default: 5000).host='0.0.0.0': permette l’accesso al server da qualsiasi IP (default:127.0.0.1).
Avvia l’applicazione dal terminale:
python app.py
Dovresti vedere un output simile a questo:
* Running on http://127.0.0.1:5000
* Debug mode: on
Apri il browser e vai all’indirizzo http://127.0.0.1:5000. Vedrai scritto: Ciao, Flask!
Come funziona
Analizziamo il codice riga per riga:
from flask import Flask
Importa la classe Flask dalla libreria.
app = Flask(__name__)
Crea un’istanza dell’applicazione. __name__ è una variabile Python che contiene il nome del modulo corrente — Flask la usa per trovare le risorse del progetto.
@app.route('/')
def home():
return 'Ciao, Flask!'
Il decorator @app.route('/') dice a Flask: “quando il browser richiede la pagina /, esegui la funzione home”.
La funzione restituisce il testo che il browser mostrerà.
app.run(debug=True)
Avvia il server. Il parametro debug=True è utile durante lo sviluppo: riavvia automaticamente il server ad ogni modifica del codice e mostra errori dettagliati nel browser.
Warning
debug=Truenon va mai usato in produzione.
Esercizi semplici su Flask
Esercizio f101
Modifica app.py in modo che la pagina principale mostri il tuo nome e cognome.
Esercizio f102
Aggiungi una seconda funzione che risponda all’indirizzo /saluto e restituisca il testo "Benvenuto nel corso di Flask!".
Tip
Segui lo stesso schema della funzione
home, cambiando il path nel decorator e il nome della funzione.
Esercizio f103
Cosa succede se provi ad andare su un indirizzo che non esiste, come http://127.0.0.1:5000/pippo? Prova e descrivi quello che vedi.
Routing e views
Fino ad ora abbiamo definito route statiche (con URL fissi), come / e /saluto.
Flask permette però di definire route dinamiche, dove parte dell’URL è una variabile.
@app.route('/utente/<nome>')
def utente(nome):
return f'Ciao, {nome}!'
Se vai su http://127.0.0.1:5000/utente/Marco, il browser mostrerà: Ciao, Marco!
La parte <nome> nell’URL viene catturata e passata come parametro alla funzione.
Tipi di parametro
Per default il parametro è una stringa, ma puoi specificare un tipo:
@app.route('/prodotto/<int:id>')
def prodotto(id):
return f'Hai richiesto il prodotto numero {id}'
I tipi disponibili sono:
| Tipo | Esempio URL | Valore ricevuto |
|---|---|---|
string (default) | /utente/Marco | 'Marco' |
int | /prodotto/42 | 42 |
float | /prezzo/3.99 | 3.99 |
Metodi HTTP: GET e POST
Ogni richiesta HTTP ha un metodo che indica l’intenzione del client:
- GET — chiede di ricevere dati (es. aprire una pagina)
- POST — invia dati al server (es. compilare un form)
Per default, Flask risponde solo alle richieste GET. Per accettare anche il POST, bisogna specificarlo:
from flask import Flask, request
app = Flask(__name__)
@app.route('/dati', methods=['GET', 'POST'])
def dati():
if request.method == 'POST':
return 'Hai inviato un POST'
return 'Hai fatto una richiesta GET'
L’oggetto request contiene tutte le informazioni sulla richiesta in arrivo: il metodo, i dati del form, i parametri URL, e altro ancora.
Parametri GET nell’URL
Oltre ai parametri dinamici nel path, puoi leggere i parametri query string, quelli che appaiono dopo il ? nell’URL:
http://127.0.0.1:5000/cerca?q=flask
@app.route('/cerca')
def cerca():
termine = request.args.get('q', '')
return f'Stai cercando: {termine}'
request.args.get('q', '') legge il parametro q dall’URL. Il secondo argomento ('') è il valore di default se il parametro non è presente.
Dati inviati con POST
Quando un form HTML invia dati con il metodo POST, questi arrivano nel corpo della richiesta e si leggono con request.form:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
utente = request.form.get('utente')
password = request.form.get('password')
return f'Accesso come: {utente}'
return 'Pagina di login (GET)'
Note
I template HTML per i form li vedremo nel prossimo capitolo. Per ora basta sapere come Flask riceve i dati.
Restituire codici di stato HTTP
Ogni risposta HTTP ha un codice di stato. Flask restituisce 200 OK per default, ma puoi specificarne uno diverso:
@app.route('/non-trovato')
def non_trovato():
return 'Pagina non trovata', 404
I codici più comuni che incontrerai:
| Codice | Significato |
|---|---|
200 | OK — tutto bene |
201 | Created — risorsa creata |
400 | Bad Request — richiesta malformata |
404 | Not Found — risorsa non trovata |
500 | Internal Server Error — errore del server |
Esercizi
Esercizio f111
Crea una route /saluta/<nome> che restituisca "Ciao, [nome]! Benvenuto nel corso.".
Esercizio f112
Crea una route /somma/<int:a>/<int:b> che restituisca il risultato della somma dei due numeri.
Tip
Ricorda che puoi usare f-string per costruire la risposta.
Esercizio f113
Crea una route /cerca che legga un parametro q dalla query string e restituisca "Risultati per: [q]". Se il parametro non è presente, restituisca "Nessun termine di ricerca" con codice di stato 400.