Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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=True non 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:

TipoEsempio URLValore ricevuto
string (default)/utente/Marco'Marco'
int/prodotto/4242
float/prezzo/3.993.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:

CodiceSignificato
200OK — tutto bene
201Created — risorsa creata
400Bad Request — richiesta malformata
404Not Found — risorsa non trovata
500Internal 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.