Flask è un framework web par­ti­co­lar­men­te leggero, in­te­res­san­te sia per chi è agli inizi sia per i pro­fes­sio­ni­sti. Si limita all’es­sen­zia­le e consente l’im­ple­men­ta­zio­ne di librerie esterne.

Python e i framework web

Python è un popolare lin­guag­gio di pro­gram­ma­zio­ne web che favorisce l’uso di codici semplici e brevi. Lo stile di pro­gram­ma­zio­ne pulito riduce al minimo gli errori e fa sì che gli utenti possano com­pren­de­re ra­pi­da­men­te anche un tutorial su Python. Svi­lup­pa­to da Guido van Rossum nel 1991, questo lin­guag­gio è oggi uti­liz­za­to e mantenuto da un’ampia comunità sotto la su­per­vi­sio­ne dell’as­so­cia­zio­ne no-profit Python Software Foun­da­tion. Il lin­guag­gio è dinamico, open source e mul­ti­piat­ta­for­ma. Inoltre, supporta la pro­gram­ma­zio­ne fun­zio­na­le e orientata agli oggetti, oltre che il logging, e può essere eseguito come script CGI.

Sono di­spo­ni­bi­li diversi framework web che per­met­to­no di uti­liz­za­re Python per creare siti web dinamici e svi­lup­pa­re ap­pli­ca­zio­ni web. Questi for­ni­sco­no il codice ne­ces­sa­rio per fa­ci­li­ta­re il processo di sviluppo e sem­pli­fi­ca­re le ope­ra­zio­ni ripetute. Gli errori o i problemi di Python possono essere così evitati e i servizi web diventano operativi più ve­lo­ce­men­te e in modo più sicuro. Le funzioni più richieste possono essere adottate di­ret­ta­men­te senza la necessità di una pro­gram­ma­zio­ne in­di­pen­den­te. Uno dei framework web più noti per Python è il CMS Django, una soluzione full-stack che offre una vasta gamma di funzioni diverse, come emerge dal confronto tra Flask e Django. Tuttavia, a causa delle sue di­men­sio­ni, questo framework è anche re­la­ti­va­men­te rigido. Una delle con­tro­par­ti più note è Flask.

Cos’è Flask?

Mentre framework full-stack come Django for­ni­sco­no le proprie librerie agli svi­lup­pa­to­ri e alle svi­lup­pa­tri­ci, Flask per Python adotta un approccio diverso. Il framework web, pre­sen­ta­to dallo svi­lup­pa­to­re austriaco Armin Ronacher nel 2010, adotta un approccio più mi­ni­ma­li­sta. Include solo il template engine Jinja e una libreria chiamata “Werkzeug”. Tuttavia, questo framework offre la pos­si­bi­li­tà di integrare funzioni di terze parti. È fornito con licenza BSD, è libero e open source. Ideato come con­tro­pro­po­sta a Django e ad altri framework, Flask per Python ha ra­pi­da­men­te ispirato una grande community di fan.

Con­fi­gu­ra­zio­ne di Flask in Python e le sue ap­pli­ca­zio­ni web: tutorial

Prima di con­fi­gu­ra­re Flask per Python, as­si­cu­ra­ti di sod­di­sfa­re i requisiti. Avrai bisogno di avere Python in­stal­la­to. Ti servirà anche un editor di testo o un IDE e l’accesso a internet. È utile inoltre avere una co­no­scen­za di base su Python. Anche la com­pren­sio­ne della pro­gram­ma­zio­ne, dei tipi di dati e dei cicli for è un vantaggio. Flask è un buon punto di partenza per imparare a costruire ap­pli­ca­zio­ni web. Il framework si configura come segue:

  1. Crea un ambiente virtuale per separare il nuovo progetto dal resto delle librerie o dei progetti Python ed evitare problemi al sistema. Il codice si presenta così:
$ python -m venv newproject
  1. Installa Flask. Il modo migliore per farlo è usare il programma di gestione dei pacchetti pip. Il comando ap­pro­pria­to è:
$ pip install flask
  1. Verifica che l’in­stal­la­zio­ne sia avvenuta con successo:
python -c "import flask; print(flask.__version__)"
  1. Ora puoi testare Flask e creare un’ap­pli­ca­zio­ne di base. Per farlo, apri un file nella tua cartella. In questo esempio lo abbiamo de­no­mi­na­to start.py e usiamo nano per accedervi:
$ nano start.py
  1. Scrivi il seguente codice nel file:
from flask import Flask
app = Flask(__name__)
@app.route ( "/" )
def test ( ):
return "Questo è un test"
  1. Salva e chiudi il file.

  2. Usa la variabile d’ambiente FLASK_APP per indicare a Flask la posizione del file cor­ri­spon­den­te:

$ export FLASK_APP=start
  1. Usa FLASK_ENV per esportare il file in modalità di sviluppo:
$ export FLASK_ENV=development
  1. Ora esegui l’ap­pli­ca­zio­ne:
$ flask run

Il risultato dovrebbe essere simile a quanto segue:

Output
- Serving Flask app "start" (lazy loading)
- Environment: development
- Debug mode: on
- Running on [IP address]/ (Press CTRL+C to quit)
- Restarting with stat
- Debugger is active!
- Debugger PIN [PIN]

Vantaggi e svantaggi di Flask Python

Vi sono buone ragioni per uti­liz­za­re Flask. Tuttavia, alcuni aspetti possono essere sfa­vo­re­vo­li. Per questo motivo, conviene esaminare più da vicino i pro e i contro di questo framework web.

Vantaggi

Ambito di ap­pli­ca­zio­ne: è difficile trovare un framework più leggero di Flask per Python. Infatti, è veloce da in­stal­la­re e facile da usare. Fles­si­bi­li­tà: Flask offre una fles­si­bi­li­tà ec­ce­zio­na­le. Potrai risolvere i problemi e im­ple­men­ta­re le librerie di cui hai bisogno, af­fron­tan­do ogni progetto in­di­vi­dual­men­te. Ap­pren­di­men­to: Flask è facile da imparare anche solo seguendo un tutorial apposito. Il framework è vo­lu­ta­men­te semplice, ma può essere uti­liz­za­to anche per progetti im­pe­gna­ti­vi. Pertanto, è un’ottima scelta sia per chi è agli inizi che per i pro­fes­sio­ni­sti che lavorano a progetti più complessi. Open source: il framework Flask è open source e di­spo­ni­bi­le gra­tui­ta­men­te. Provalo e scopri se è lo strumento giusto per le tue esigenze. Community: Flask è sup­por­ta­to da una vasta community che fornisce consigli e supporto ai nuovi arrivati e agli svi­lup­pa­to­ri e alle svi­lup­pa­tri­ci più esperte. Le domande e gli errori vengono quindi risolti ra­pi­da­men­te.

Svantaggi

Ambito di ap­pli­ca­zio­ne: a seconda dell’uso che se ne intende fare, la sua portata mi­ni­ma­li­sta può essere svan­tag­gio­sa. Tutti gli strumenti ri­chie­do­no un’in­stal­la­zio­ne in­di­vi­dua­le. I framework al­ter­na­ti­vi offrono un numero si­gni­fi­ca­ti­va­men­te maggiore di funzioni pre­in­stal­la­te. Di­pen­den­za da fornitori di terze parti: l’uso di librerie esterne è sempre una possibile fonte di errori, ma Flask dipende da esse. Re­spon­sa­bi­li­tà: mentre altri framework vengono mantenuti au­to­ma­ti­ca­men­te, Flask lascia questa re­spon­sa­bi­li­tà all’utente. Ciò implica un maggior controllo, ma anche più lavoro.

Esempio di Hello World: routing, template e API

Per capire meglio il fun­zio­na­men­to di base di Flask, segue un piccolo esempio che illustra i prin­ci­pa­li concetti fon­da­men­ta­li del framework web. A tal fine, creiamo una semplice ap­pli­ca­zio­ne web che mostra come routing, template e un’API REST fun­zio­na­no insieme. L’esempio è composto da due file:

  • app.py: qui si trova il nostro codice Python.
  • templates/hello.html: questo file è un template Jinja2 per vi­sua­liz­za­re il sito web in modo dinamico.

Il file app.py si presenta come segue:

from flask import Flask, jsonify, render_template, request
app = Flask(__name__)
@app.route("/")
def home():
return "Hello World!"
@app.route("/greet/<name>")
def greet(name):
return render_template("hello.html", name=name)
@app.route("/api/square", methods=["GET"])
def square():
number = request.args.get("number", default=0, type=int)
result = number ** 2
return jsonify({"number": number, "square": result})
if __name__ == "__main__":
app.run(debug=True)
python

Questo è il file hello.html, che funge da template:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Saluto di benvenuto</title>
</head>
<body>
<h1>Ciao, {{ name }}!</h1>
<p>benvenuto su Flask con il template Jinja2.</p>
</body>
</html>
html

Con @app.route definiamo +diversi endpoint. Si tratta di URL, a cui il server può ri­spon­de­re. La pagina iniziale (“/”) mostra sem­pli­ce­men­te il testo “Hello World!”. Tramite un percorso dinamico (“/greet/<name>”) possiamo vi­sua­liz­za­re un saluto per­so­na­liz­za­to. Il nome viene ricavato dall’URL e passato al nostro template Jinja2, che lo inserisce in HTML (vedi il codice in templates/hello.html).

Inoltre, ti mostriamo come creare una piccola API REST: sull’endpoint “/api/square” l’utente può passare un numero come parametro URL e l’app re­sti­tui­sce il quadrato del numero come risposta JSON. Vediamo quindi che Flask può gestire sia siti web classici sia endpoint API. Anche i contenuti dinamici si possono integrare fa­cil­men­te in HTML grazie ai template, senza dover mo­di­fi­ca­re ma­nual­men­te la pagina.

N.B.

Na­tu­ral­men­te, questo codice è solo un esempio minimale nell’ambito di un tutorial su Flask. Serve so­prat­tut­to a chiarire i concetti di base. In un’ap­pli­ca­zio­ne reale an­dreb­be­ro inoltre con­si­de­ra­ti aspetti come la gestione degli errori, la sicurezza, la va­li­da­zio­ne dei dati e una struttura di progetto pulita, affinché l’app rimanga stabile, af­fi­da­bi­le e ma­nu­te­ni­bi­le.

Esten­sio­ni di Flask

Poiché Flask è pensato in modo molto mi­ni­ma­li­sta, molte fun­zio­na­li­tà utili come la con­nes­sio­ne al database, l’au­ten­ti­ca­zio­ne o la va­li­da­zio­ne dei moduli non sono integrate. Per ag­giun­ge­re queste funzioni, si uti­liz­za­no le esten­sio­ni di Flask, svi­lup­pa­te e mantenute dalla community. Si integrano fa­cil­men­te in un’ap­pli­ca­zio­ne Flask ed estendono in modo si­gni­fi­ca­ti­vo le fun­zio­na­li­tà, senza dover adattare il framework stesso. In questo modo, le svi­lup­pa­tri­ci e gli svi­lup­pa­to­ri possono se­le­zio­na­re in modo mirato i com­po­nen­ti di cui hanno davvero bisogno e costruire la propria app in modo modulare. Le esten­sio­ni di norma seguono lo stesso schema di Flask e sono ben do­cu­men­ta­te.

Alcuni esempi di im­por­tan­ti esten­sio­ni Flask sono:

  • Flask-SQ­LAl­che­my: un’esten­sio­ne per la con­nes­sio­ne al database. Integra il popolare ORM SQ­LAl­che­my in Flask e consente di lavorare fa­cil­men­te con i database tramite classi Python.
  • Flask-WTF: questa esten­sio­ne supporta la creazione e la va­li­da­zio­ne di moduli web. Offre fun­zio­na­li­tà di sicurezza come la pro­te­zio­ne CSRF e facilita la gestione degli input degli utenti.
  • Flask-Login: come sug­ge­ri­sce il nome, Flask-Login si occupa della gestione sem­pli­fi­ca­ta degli utenti e dell’au­ten­ti­ca­zio­ne. L’esten­sio­ne gestisce lo stato di accesso, le sessioni e la pro­te­zio­ne degli accessi a de­ter­mi­na­ti percorsi.
  • Flask-Migrate: con Flask-Migrate ottieni fun­zio­na­li­tà di mi­gra­zio­ne del database, che ge­sti­sco­no au­to­ma­ti­ca­men­te le modifiche alla struttura del database. Ben si adatta a essere uti­liz­za­to in com­bi­na­zio­ne con Flask-SQ­LAl­che­my per con­sen­ti­re ag­gior­na­men­ti strut­tu­ra­ti.
  • Flask-RESTful: questa esten­sio­ne serve a sem­pli­fi­ca­re la creazione di API REST. Mette a di­spo­si­zio­ne in modo stan­dar­diz­za­to risorse, percorsi e metodi HTTP come GET, POST, PUT o DELETE.

Struttura del progetto e migliori pratiche

Nei progetti Flask è con­si­glia­bi­le scegliere fin dall’inizio un’or­ga­niz­za­zio­ne del progetto chiara e strut­tu­ra­ta. Anche se le piccole app possono fun­zio­na­re tec­ni­ca­men­te in un unico file, una struttura pulita facilita no­te­vol­men­te la ma­nu­ten­zio­ne e l’esten­sio­ne dell’ap­pli­ca­zio­ne.

Ti­pi­ca­men­te, per progetti più grandi si creano directory come templates per i file HTML, static per CSS, Ja­va­Script e immagini, nonché app o src per i moduli Python. All’interno della cartella dell’app possono nascere sot­to­car­tel­le per blueprint, modelli, moduli e servizi, in modo da separare lo­gi­ca­men­te le funzioni. I blueprint con­sen­to­no di strut­tu­ra­re in modo modulare i vari com­po­nen­ti dell’app, ad esempio la gestione utenti o un blog.

Le migliori pratiche con­si­glia­no inoltre di pro­teg­ge­re i valori di con­fi­gu­ra­zio­ne, come gli URL del database o le chiavi segrete, in un file config.py separato oppure tramite variabili d’ambiente. Un logging continuo aiuta a in­di­vi­dua­re gli errori in anticipo e a ri­co­strui­re il com­por­ta­men­to dell’app. È inoltre utile uti­liz­za­re ambienti virtuali per gestire in modo ordinato le di­pen­den­ze. Anche il controllo di versione con Git rientra tra le pratiche standard per rendere trac­cia­bi­li le modifiche.

Sito web con dominio
Crea il tuo sito web per­so­na­liz­za­to

MyWebsite Now Starter è lo strumento pensato per i prin­ci­pian­ti che vogliono creare un sito web in modo intuitivo. Include dominio e indirizzo e-mail.

Flask: sicurezza e test

Sicurezza e test non sono extra opzionali, ma com­po­nen­ti centrali di un’ap­pli­ca­zio­ne Flask pro­fes­sio­na­le, motivo per cui non do­vreb­be­ro mai essere tra­scu­ra­ti in nessun tutorial su Flask. Chi fin dall’inizio presta at­ten­zio­ne a crit­to­gra­fia, va­li­da­zio­ne degli input, con­fi­gu­ra­zio­ni sicure e test au­to­ma­tiz­za­ti sviluppa ap­pli­ca­zio­ni web stabili e sicure, che in seguito si possono estendere senza problemi.

Sicurezza in Flask

A causa della struttura mi­ni­ma­li­sta di Flask, la re­spon­sa­bi­li­tà della sicurezza dell’ap­pli­ca­zio­ne ricade sulle svi­lup­pa­tri­ci e sugli svi­lup­pa­to­ri. Una pro­te­zio­ne di base consiste nell’utilizzo della pro­te­zio­ne CSRF per i moduli, so­prat­tut­to in presenza di input degli utenti. A questo scopo, l’esten­sio­ne Flask-WTF offre mec­ca­ni­smi col­lau­da­ti.

Le password non do­vreb­be­ro mai essere salvate in chiaro, ma sempre cifrate o con hashing. A questo scopo sono adatte, ad esempio, le librerie werkzeug.security o bcrypt. Al­tret­tan­to im­por­tan­te è la va­li­da­zio­ne dell’input, per prevenire le iniezioni SQL, gli attacchi XSS o altre ma­ni­po­la­zio­ni.

Per le sessioni e i cookie dovresti impostare i flag HttpOnly e Secure per pro­teg­ge­re i dati sensibili. Le con­fi­gu­ra­zio­ni come URL del database o chiavi API do­vreb­be­ro essere gestite tramite variabili d’ambiente o file di con­fi­gu­ra­zio­ne separati, invece che di­ret­ta­men­te nel codice.

Test su Flask

Come in qualsiasi ap­pli­ca­zio­ne pro­gram­ma­ta, anche su Flask i test sono fon­da­men­ta­li per garantire la stabilità dell’ap­pli­ca­zio­ne. Con i co­sid­det­ti test unitari vengono ve­ri­fi­ca­te singole funzioni in modo isolato, mentre i test di in­te­gra­zio­ne ve­ri­fi­ca­no l’in­te­ra­zio­ne tra più com­po­nen­ti.

Flask offre a questo scopo un sistema di test client integrato che consente di simulare richieste HTTP senza avviare realmente il server. In questo modo si possono ve­ri­fi­ca­re au­to­ma­ti­ca­men­te percorsi, template ed endpoint API. È par­ti­co­lar­men­te im­por­tan­te scrivere re­go­lar­men­te casi di test, so­prat­tut­to per le nuove fun­zio­na­li­tà, per evitare re­gres­sio­ni. In com­bi­na­zio­ne con l’in­te­gra­zio­ne continua si ga­ran­ti­sce che l’app resti af­fi­da­bi­le anche in caso di modifiche.

Vai al menu prin­ci­pa­le