Ricarica automatica dell'app Paskon Flask in caso di modifiche al codice


202

Sto studiando come sviluppare un'app Web decente con Python. Dal momento che non voglio che alcune strutture di alto ordine si frappongano, la mia scelta è caduta sul leggero telaio Flask . Il tempo dirà se questa è stata la scelta giusta.

Quindi, ora ho impostato un server Apache con mod_wsgi e il mio sito di test funziona correttamente. Tuttavia, mi piacerebbe accelerare la routine di sviluppo facendo ricaricare automaticamente il sito su qualsiasi modifica apportata ai file PY o modello. Vedo che qualsiasi modifica al file .wsgi del sito provoca il ricaricamento (anche senza WSGIScriptReloading On nel file di configurazione di Apache), ma devo ancora produrlo manualmente (cioè inserire ulteriore interruzione di riga, salvare). Esiste un modo per causare il ricaricamento quando modifico alcuni file py dell'app? Oppure, dovrei usare IDE che aggiorna il file .wsgi per me?

Risposte:


229

Il modo attualmente raccomandato è con l' flaskutilità della riga di comando.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Esempio:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

o in un comando:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Se si desidera una porta diversa da quella predefinita ( 5000) aggiungere l' --portopzione.

Esempio:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Altre opzioni sono disponibili con:

$ flask run --help

3
o pyvenv in python3.5, flask runfunziona anche da quando pip install flask, nella venv/bin/cartella è installato anche un file eseguibile di pallone .
TonyTony,

Questa è una soluzione semplice che può essere tradotta in Docker a scopo di sviluppo. Si può vedere questa stessa soluzione qui .

Funziona bene normalmente ma questo non sembra funzionare su Ubuntu con codice su una partizione NTFS. Non è un problema con il codice ma il pallone non sembra riconoscere i cambiamenti in quella configurazione.
citynorman,

211

Se stai parlando di ambienti test / dev, usa semplicemente l'opzione di debug. Ricaricherà automaticamente l'app del pallone quando si verifica una modifica del codice.

app.run(debug=True)

Oppure, dalla shell:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode


6
Funziona solo quando si esegue il sito tramite il server di sviluppo integrato. Ma non quando lo si esegue tramite wsgi, su Apache. E non insisto sul fatto che ho davvero bisogno di eseguirlo su Apache, quindi forse quello che suggerisci è il modo giusto per farlo.
Venerdì

4
corretta. In ambiente di sviluppo, il server integrato funziona davvero bene e non è necessario reinventare la ruota per ricaricare l'app. Vi consiglio caldamente di usare il server integrato per dev. scopi. In ogni caso, non vuoi ricaricare automaticamente l'app ad ogni cambio di codice.
codegeek,

44

In ambienti di test / sviluppo

Il debugger di werkzeug ha già una funzione di "ricarica automatica" disponibile che può essere abilitata effettuando una delle seguenti operazioni:

app.run(debug=True)

o

app.debug = True

È inoltre possibile utilizzare un file di configurazione separato per gestire tutte le impostazioni, se necessario. Ad esempio, utilizzo "settings.py" con un'opzione "DEBUG = True". Anche l'importazione di questo file è semplice;

app.config.from_object('application.settings')

Tuttavia, questo non è adatto per un ambiente di produzione.

Ambiente di produzione

Personalmente ho scelto Nginx + uWSGI su Apache + mod_wsgi per alcuni motivi di prestazioni ma anche per le opzioni di configurazione. L' opzione touch-reload ti consente di specificare un file / una cartella che farà sì che l'applicazione uWSGI ricarichi l'app di flask appena distribuita.

Ad esempio, lo script di aggiornamento abbassa le ultime modifiche e tocca il file 'reload_me.txt'. Il tuo script ini uWSGI (che è mantenuto da Supervisord - ovviamente) ha questa linea in qualche parte:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

Spero che aiuti!


1
Grazie per l'ottimo consiglio. L'ho semplificato un po '. Crea uno script bash che si tocchi durante l'esecuzione. Quindi devi solo avviarlo quando vuoi ricaricare. La mia soluzione: # touch_me_and_reload.sh touch $ 0
Jabba

@Ewan. dove dovrebbe essere la linea di ricarica del tocco? la sezione [programma: uwsig] o la sezione [supervisord]?
user805981

@ user805981- nessuno dei due .inifile di configurazione uwsgi separato . Se leggi la documentazione su "touch-ricaricare" è nella configurazione di uWSGI, non di supervisore.
Ewan,

Grazie per questo. app.run(debug=True)fallisce, ma l'impostazione della variabile ambientale funziona.
Ari

23

Se stai utilizzando Uwsgi, guarda l'opzione di ricarica automatica di Python:

uwsgi --py-autoreload 1

Esempio uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Quindi eseguire:

uwsgi --ini uwsgi-dev-example.ini

Nota: questo esempio abilita anche il debugger.

Ho seguito questa strada per imitare la produzione il più vicino possibile con la mia configurazione di nginx. Semplicemente eseguendo l'app flask con il suo web server integrato dietro nginx si tradurrebbe in un errore gateway errato.


16

Alcuni aggiornamenti per Flask 1.0 e versioni successive

l'approccio di base per il nuovo caricamento a caldo è:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run

export FLASK_ENV=developmentha funzionato per me. app.run(debug=True)non sembra funzionare.
alex

3

Ho avuto un'idea diversa:

Primo:

pip install python-dotenv

Installa il python-dotenvmodulo, che leggerà le preferenze locali per l'ambiente del tuo progetto.

Secondo:

Aggiungi il .flaskenvfile nella directory del progetto. Aggiungi il seguente codice:

FLASK_ENV=development

E 'fatto!

Con questa configurazione per il tuo progetto Flask, quando esegui flask rune vedrai questo output nel tuo terminale:

inserisci qui la descrizione dell'immagine

E quando modifichi il tuo file, salva la modifica. Vedrai che il ricaricamento automatico è lì per te:

inserisci qui la descrizione dell'immagine

Con più spiegazioni:

Ovviamente puoi colpire manualmente export FLASK_ENV=developmentogni volta che ne hai bisogno. Ma usare file di configurazione diversi per gestire l'ambiente di lavoro effettivo sembra una soluzione migliore, quindi consiglio vivamente questo metodo che uso.


Perfetto! inoltre, non dimenticare di includere la FLASK_APPvariabile nel .flaskenvfile.
Cequiel,

2

Le applicazioni Flask possono essere eseguite facoltativamente in modalità debug. In questa modalità, due moduli molto utili del server di sviluppo chiamati reloader e debugger sono abilitati per impostazione predefinita. Quando il reloader è abilitato, Flask controlla tutti i file di codice sorgente del progetto e riavvia automaticamente il server quando uno dei file viene modificato.

Per impostazione predefinita, la modalità debug è disabilitata. Per abilitarlo, impostare una FLASK_DEBUG=1variabile di ambiente prima di richiamare il matraccio run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Avere un server in esecuzione con il reloader abilitato è estremamente utile durante lo sviluppo, perché ogni volta che modifichi e salvi un file sorgente, il server si riavvia automaticamente e prende la modifica.



0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "sviluppo"

corsa del pallone

Dovrebbe essere funzionato


Forse sarebbe utile aggiungere un po 'più di contesto a questa idea, ad esempio qual è il set di strumenti, il sistema operativo host, ecc.
Manfred
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.