Come usare il web framework Flask
Pubblicato da Michele Saba
In questa lezione faremo un'introduzione Flask e creeremo il nostro primo progetto con questo framework. Questo ci permetterà di comprenderne il contesto di sviluppo e acquisire familiarità con gli aspetti propri e caratteristici di Flask, in modo da creare una base da cui poter partire per introdurre concetti sempre più avanzati.
A che cosa serve Flask?
Flask è un web framework open source scritto con Python caratterizzato da flessibilità, leggerezza e semplicità d'uso. Fa parte della categoria dei micro-framework per via del suo approccio allo sviluppo minimalista non opinionato, che lascia agli sviluppatori la possibilità di scegliere quando e soprattutto come implementare ogni aspetto delle proprie web app a partire dalla struttura del progetto, scegliendo quali funzionalità è davvero necessario implementare, quanti e quali file/moduli creare, le convenzioni di sviluppo a cui fare riferimento è così via.
Nel caso di Flask micro-framework significa quindi possedere un core semplice e performante che mette a disposizione funzionalità fondamentali quali server di sviluppo e debugger, routing, supporto unit testing integrato, protezione contro cross-site scripting (XSS) e l'impiego di Jinja 2 come template engine. A differenza dei web framework full stack come Django, Flask non include ad esempio una database API, un sistema di autenticazione, upload o di validazione dei form: questo genere di funzionalità vengono incluse in una web app sito scritto con Flask tramite l'utilizzo di estensioni dedicate, che una volta integrate nel progetto potranno essere usate e facilmente come se facessero parte del framework stesso.
Nel sito ufficiale di Flask è presente un vero e proprio registro delle estensioni moderato dagli sviluppatori del framework e aggiornato regolarmente in modo da garantire un alto livello di qualità per tutte le estensioni più importanti. Alcune estensioni famose sono ad esempio Flask-Login per l'aggiunta di un sistema di autenticazione, Flask-SQLAlchemy e Flask-Migrate per lavorare comodamente col database, Flask-WTF per la gestione dei form ed altre ancora. Flask può quindi essere utilizzato per qualsiasi tipologia di progetto: si trova in cima alla lista dei web framework più utilizzati assieme a Django ed entrambi possono vantare ben oltre 60 mila stelle su GitHub a prova del loro grande valore nella Community di Python.
Tra i suoi utilizzatori celebri in vanta Linkedin e Pinterest, ed è impiegato per la creazione di siti, web app complete e microservizi in progetti e aziende di ogni livello. Grazie al suo approccio allo sviluppo flessibile, che incoraggia la personalizzazione del codice partendo da una base minimalista, facilita la creazione di componenti e servizi altamente personalizzati.
Installazione di Flask e relative dipendenze
Installiamo Flask nel nostro ambiente virtuale tramite pip:
pip install flask
Tra le varie dipendenze che servono per far funzionare Flask possiamo trovare i seguenti package:
- Werkzeug: si tratta di una libreria Web Server Gateway Interface per web app: è la libreria principale su cui si basa Flask ed offre, ad esempio, gli oggetti request e response che possiamo poi utilizzare.
- Jinja2: è un motore di template per Python.
- itsdangerous: utilizzato per mantenere la sicurezza e l'integrità dei cookie di sessione.
- click: un framework utilizzato per la creazione di interfacce a riga di comando (CLI).
- MarkupSafe: che utilizzato da Jinja serve per migliorare la sicurezza generale dell'applicazione.
Creiamo il nostro primo progetto con Flask
Ora che Flask è installato all'interno dell'ambiente virtuale possiamo creare una nuova cartella e al suo interno di questa cartella possiamo ora creare il nostro primo progetto.
mkdir hello_flask
Abbiamo visto che la filosofia di Flask lascia a noi sviluppatori la possibilità e il compito di dover allestire il progetto in base alle nostre esigenze o preferenze: possiamo addirittura creare un unico file per contenere il codice di cui abbiamo bisogno. Creiamo un nuovo file application.py e iniziamo a scrivere il nostro programma.
Importiamo la classe Flasks dal package quindi inizializziamo la nostra applicazione creando una variabile app a cui passiamo la variabile dunder name che rappresenta il nome del modulo dove è stata chiamata e permette quindi a Flask di sapere ad esempio dove andare a cercare template, file statici e quant'altro.
from flask import Flask
app = Flask(__name__)
Definiamo una nuova funzione homepage che restituisca con return la stringa “Hello World”:
def homepage():
return "Hello World!"
Questa è quella che nel contesto dello sviluppo web chiamiamo funzione View: ci permette di poter gestire un URL del nostro sito web, avremo quindi tante funzioni view quante sono le aree del nostro sito cosicché Flask sappia esattamente quale contenuto va servito in base al percorso che l'utente sta visitando.
Anche il nome della funzione è molto importante perché come vedremo più avanti viene utilizzato per creare gli URL, ma per ora ci interessa comprendere come effettuare un collegamento tra il percorso che l'utente visita e la view che va richiamata di conseguenza.
Se in altri framework, come ad esempio Django, è presente in un file un elenco che contiene tutti i vari percorsi visitabili nel nostro sito, in Flask utilizziamo il decoratore @app e il metodo route, a cui passiamo il percorso che vogliamo utilizzare, in questo caso la homepage (quindi semplicemente uno slash “/”) che andrà a chiamare il contenuto definito in questa funzione quando verrà visitata.
@app.route("/")
def homepage():
return "Hello World!"
Creiamo anche un’altra funzione view chiamata contatti mappata a collegare all’URL /contatti:
@app.route("/contatti")
def contatti():
return "Contattaci!"
Torniamo al nostro terminale e proviamo ad avviare il server di sviluppo:
flask run
Il comando ha funzionato però otteniamo allo stesso tempo anche un errore: la libreria Flask non è stato in grado di trovare di individuare la nostra applicazione, quindi dobbiamo comunicargli che vogliamo venga eseguito questo specifico file. Per fare ciò utilizziamo la variabile d’ambiente FLASK_APP, ovvero una variabile definita a livello del sistema operativo che ci permette di andare a memorizzare alcune impostazioni in questo caso relative al funzionamento della nostra applicazione Flask.
# Su Unix Bash
export FLASK_APP=application.py
# Su Windows CMD
set FLASK_APP=application.py
# Su Windows PowerShell
$env:FLASK_APP = "application.py"
Una volta che abbiamo impostato la variabile possiamo ridare il comando flask run e avremo il server di sviluppo attivo che gira sul nostro indirizzo locale:
* Serving Flask app 'application.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [30/Mar/2023 16:32:23] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [30/Mar/2023 16:32:23] "GET /favicon.ico HTTP/1.1" 404 -
Copiamo e incolliamo nel browser http://127.0.0.1:5000, ci troviamo sulla homepage, quindi otteniamo il nostro messaggio “Hello World!” Se andiamo all’indirizzo http://127.0.0.1:5000/contatti, vedremo il messaggio “Contattaci!”. Se proviamo a navigare in un URL per cui non è presente corrispondenza otteniamo il codice di stato 404.
Proviamo a modificare lo stile della nostra Homepage aggiungendo del codice HTML alla stringa della view:
@app.route("/")
def homepage():
return "<h1 style='color: red;'>Hello World!</h1>"
Se riavviamo il server vedremo che la scritta “Hello World!” è diventata rossa. Dover bloccare e riavviare il server di sviluppo ogni volta che applichiamo una semplice modifica alle nostre view non è sicuramente comodo: per fortuna c’è un modo molto più pratico.
Come avviare il server in modalità debug
Definiamo un’altra variabile d’ambiente chiamata FLASK_ENV e impostiamola su “development” in modo che Flask sappia che siamo in fase di sviluppo e che quindi ci può servire il debugger integrato in modo da poter ottenere tutti questi cambiamenti in maniera automatica senza dover ogni volta riavviare manualmente il server.
# Su Unix Bash
export FLASK_ENV=development
# Su Windows CMD
set FLASK_ENV=development
# Su Windows PowerShell
$env:FLASK_ENV = "development"
NOTA: A partire da Flask 2.3 questo comando sarà deprecato e bisognerà utilizzare:
flask run --debug
Avviamo quindi in modalità debug e otterremo questo output nel terminale:
* Serving Flask app 'application.py'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: nnn-nnn-nnn
Nell’ultima riga è definito anche un PIN per il debugger: si tratta semplicemente di una misura di sicurezza aggiuntiva del server di sviluppo di Flask.
Verifichiamo che la modalità debug funzioni cambiando la scritta da rossa a verde:
@app.route("/")
def homepage():
return "<h1 style='color: green;'>Hello World!</h1>"
Tornando sul browser se riavviamo la pagina il nostro h1 è verde!
Questa lezione è parte di uno dei nostri corsi professionali, chiamato Crea il Tuo Blog Personale con Python e Flask. L'iscrizione al corso non è al momento possibile, in quanto nel passaggio da Bootstrap 4 a Bootstrap 5 (usato per lo sviluppo del frontend) parte della compatibilità col codice è stata perduta e il corso non è ancora stato aggiornato. In compenso puoi trovare tutto il codice nel mio profilo GitHub. Dando uno sguardo ai vari commit sul branch principale, sarai in grado di ripercorrere le varie lezioni del corso ed imparare autonomamente... anche se capisco che questo non sia come avere un corso o una guida completa. In alternativa, dai uno sguardo all'elenco dei nostri corsi professionali!