Oggi parleremo del server di sviluppo e del sistema di debug di Flask. Essi dipendono dalla libreria Werkzeug. libreria completa di applicazioni web WSGI, un progetto iniziato come una semplice raccolta di varie utilità per le applicazioni WSGI ed è diventata una delle librerie più avanzate.
app.run()
Il modulo di Flask è dotato di un server proprio per testare l’applicativo durante lo sviluppo, tale server viene avviato dal metodo run(), tale metodo può contenere diverse opzioni di argomenti per essere gestito. Andiamo a rivedere l’articolo scritto in precedenza sull’istallazione del sistema e ne prendiamo il codice di esempio.
from flask import Flask // Creo l'oggetto flask app = Flask(__name__) // Creo le viste @app.route("/") def homePage(): return "<h1>Hello World</h1>" // Lancio l'applicativo senza il sistema di debug‹› if __name__ == '__main__': app.run()
Prendiamo ora in esame le ultime due righe che sono proprio quelle che ci servono ad avviare il server e testare il progetto. La riga:
if __name__ == '__main__':
È usata per garantire che il server web di sviluppo venga avviato solo quando lo script viene eseguito direttamente. E la riga:
app.run()
Qui verrà richiamato il metodo run() dall’oggetto app che avvierà il server in un ciclo il quale attenderà richieste, e servirà risposte, finche’ non verrà interrotto dall’utente ad esempio con un CTRL-C.
Per lanciare l’applicazione quindi basterà digitare il comando da terminale
python nomeFile.py
Aprire un browser e digitare nella barra degli indirizzi:
localhost:5000
Oppure:
127.0.0.1:5000
Come detto in precedenza il metodo run() supporta varie differenti opzioni che vediamo in seguito.
- host – il nome host su cui ascoltare.
- port – la porta del server web.
- debug – se fornito, abilita o disabilita la modalità di debug.
- load_dotenv – caricare i file .env e .flaskenv più vicini per impostare le variabili di ambiente.
- use_reloader – il server dovrebbe riavviare automaticamente il processo python se i moduli sono stati modificati.
- use_debugger – dovrebbe essere utilizzato il sistema di debug werkzeug.
- use_evalex – dovrebbe essere abilitata la funzione di valutazione delle eccezioni.
- extra_files – un elenco di file che il reloader dovrebbe guardare in aggiunta ai moduli.
- reloader_interval – l’intervallo per il ricaricatore in secondi.
- reloader_type – il tipo di caricatore da utilizzare.
- threaded – il processo dovrebbe gestire ogni richiesta in un thread separato.
- processes – se maggiore di 1, gestisci ogni richiesta in un nuovo processo fino a questo numero massimo di processi simultanei.
- passthrough_errors – imposta questo su True per disabilitare la cattura degli errori.
- ssl_context – un contesto SSL per la connessione.
Durante lo sviluppo è conveniente abilitare la modalità debug, che tra l’altro attiva il debugger e il reloader. Questo viene fatto passando l’argomento debug settato a True.
if __name__ == '__main__': app.run(debug=True)
flask run
Il sistema Flask mette a disposizione un altro modo per avviare il server di sviluppo lo fa usando un modulo di interfaccia command line tramite il comando flask, istallato direttamente insieme all’istanza di Flask. Per attivare il server basterà aprire un terminale, posizionarci all’interno della cartella del progetto e lanciare il comando:
flask run
Prima di lanciare tale riga è necessario comunicare al comando flask dove si trova l’istanza dell’applicazione Flask, in modo che possa importarla ed usarla. Questo si fa settando una variabile d’ambiente nel seguente modo:
Per Mac e Linux export FLASK_APP=nomeFile.py
Per Windows set FLASK_APP=nomeFile.py
Aprendo un browser all’indirizzo 127.0.0.1:5000 vedremo l’applicazione funzionare.
Molto importante per migliorare le condizioni del lavoro di sviluppo è utilizzare il sistema di debug. Questo permette all’applicazione di aggiornare le modifiche fatte al codice in runtime, altrimenti dopo ogni cambiamento si dovrebbe uscire dal server di sviluppo e rientrarvi, invece così basta fare solamente un refresh della pagina per vedere le modifiche applicate. Per far ciò bisogna settare un’altra variabile d’ambiente:
Per Mac e Linux export FLASK_ENV=developement
Per Windows set FLASK_ENV=developement
Nelle ultime versioni questo modo è deprecato anche se al momento è ancora funzionante, ed è stato sostituito da un’altra variabile d’ambiente:
export FLASK_DEBUG=1
Quindi ogni volta che entriamo nell’ambito virtuale e iniziamo il lavoro di sviluppo dobbiamo lanciare questi comandi:
export FLASK_DEBUG=1 export FLASK_APP=nomeFile.py flask -- debug run
Sinceramente questo sistema è migliorabile rendendo permanente il settaggio delle variabili d’ambiente in un file. Questo lo facciamo installando il python-dotenv, questo pacchetto legge coppie chiave-valore da un file .env e può impostarle come variabili di ambiente.
pip install python-dotenv
Una volta installato creiamo un file chiamato .flaskenv e vi editiamo dentro le variabili d’ambiente citate in precedenza.
FLASK_DEBUG=1 FLASK_APP=nomeFile.py
A questo punto non sarà più necessario richiamarle al primo avvio del server, operazione che verrà fatta direttamente dal sistema leggendo il file.env.
Se non volessimo settare variabili d’ambiente e o creare file .env e o non utilizzare il python-dotenv basterà semplicemente lanciare il comando:
flask --app=nomeFile.py --debug run
La dicitura sopraelencata va a sostituire le variabili d’ambiente.
Utilizzando il modo flask run potremmo anche cancellare le righe di codice dal programma:
if __name__ == '__main__': app.run()
Non essendo più necessarie, anche se esse comunque possono tranquillamente coesistere senza creare problemi.
Conclusioni
Non c’è gran differenza se usare un modo o un’altro per eseguire il server di sviluppo, vanno bene entrambi in egual modo anche se il team del progetto Flask raccomanda di usare l’opzione flask run. La scelta rimane comunque alla discrezione dello sviluppatore in funzione del proprio contesto. L’unica cosa che si può dire a sfavore di app.run() è che ci potrebbero essere problemi di ricaricamento pagina dopo una modifica. Ovviamente questi modi vanno bene solo in fase di sviluppo e non in face di produzione. Per una distribuzione di produzione utilizzare un server Web pronto per la produzione come gunicorn o uWSGI.
Extra
Se volessimo vedere girare l’applicazione su altri dispositivi oltre a quello in locale, bisogna collegarli alla stessa rete e lanciare il comando:
flask run --host="indirizzo IP della macchina su cui viene lanciato il server"
Esempio nel mio caso:
flask run --host=192.168.1.115
Prendendo un dispositivo e scrivendo nella barra degli indirizzi 192.168.1.115:5000 vi si potrà testare direttamente l’app.
SviluppoMania
Stay Tuned