Usare il server di sviluppo di Flask

Flask

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

MARCO.VERGNANI

Nella mia vita a 12 anni e' entrato a far parte un Intel 80286 con 4MB di RAM, un Hard disk da 20 MB e una primissima scheda VGA appena uscita e da allora mi si e' aperto un mondo pieno di bit. Appassionato di programmazione fin da piccolo, mi diverto a costruire piccoli robottini. Curioso delle molteplici applicazioni che le macchine automatiche possono compiere, e adoro vedere volare quegli strani oggetti chiamati droni.

Articoli correlati

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.