Je cherche comment développer une application web décente avec Python. Puisque je ne veux pas que des structures de haut niveau se mettent en travers de mon chemin, mon choix s’est porté sur le poids léger cadre Flask . Le temps nous dira si c'était le bon choix.
J'ai donc configuré un serveur Apache avec mod_wsgi et mon site de test fonctionne correctement. Toutefois, j'aimerais accélérer la routine de développement en faisant en sorte que le site soit automatiquement rechargé à la suite de modifications apportées aux fichiers py ou modèles que je crée. Je constate que toute modification apportée au fichier .wsgi du site provoque le rechargement (même sans WSGIScriptReloading On dans le fichier de configuration Apache), mais je dois tout de même le modifier manuellement (c.-à-d. Insérer un saut de ligne supplémentaire, enregistrer). Existe-t-il un moyen de provoquer un rechargement lorsque je modifie certains fichiers py de l'application? Ou bien, je suis censé utiliser IDE pour actualiser le fichier .wsgi pour moi?
La méthode actuellement recommandée (Flask> = 0.11) consiste à utiliser l'utilitaire de ligne de commande flask
.
http://flask.pocoo.org/docs/0.11/server/
Exemple:
$ export FLASK_APP=main.py
$ export FLASK_DEBUG=1
$ python -m flask run
ou en une commande:
$ FLASK_APP=main.py FLASK_DEBUG=1 python -m flask run
Je préfère python -m flask run
plutôt que flask run
car le premier fonctionne également avec virtualenv
.
Si vous voulez un port différent de celui par défaut (5000
), ajoutez l'option --port
.
Exemple:
$ python -m flask run --port 8080
Plus d'options sont disponibles avec:
$ python -m flask run --help
Si vous parlez d'environnements test/dev, utilisez simplement l'option de débogage. Il rechargera automatiquement l'application flask lorsqu'un changement de code se produira.
app.run(debug=True)
Ou, de la coquille:
$ export FLASK_DEBUG=1
$ flask run
Le débogueur werkzeug dispose déjà d'une fonction de "rechargement automatique" qui peut être activée en effectuant l'une des opérations suivantes:
app.run(debug=True)
ou
app.debug = True
Vous pouvez également utiliser un fichier de configuration séparé pour gérer toute votre configuration si vous en avez besoin. Par exemple, j'utilise 'settings.py' avec l'option 'DEBUG = True'. Importer ce fichier est aussi facile;
app.config.from_object('application.settings')
Cependant, cela ne convient pas à un environnement de production.
Personnellement, j’ai choisi Nginx + uWSGI plutôt qu’Apache + mod_wsgi pour quelques raisons de performances mais également pour les options de configuration. L'option touch-reload vous permet de spécifier un fichier/dossier qui obligera l'application uWSGI à recharger votre application flask récemment déployée.
Par exemple, votre script de mise à jour extrait vos dernières modifications et touche le fichier 'reload_me.txt'. Votre script ini uWSGI (qui est géré par Supervisord - à l’évidence) contient cette ligne quelque part:
touch-reload = '/opt/virtual_environments/application/reload_me.txt'
J'espère que ça aide!
Si vous utilisez uwsgi, consultez l’option python auto reload:
uwsgi --py-autoreload 1
Exemple 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
racine_site/__ init__.py
def register_debug_server():
from werkzeug.debug import DebuggedApplication
app = Flask(__name__)
app.debug = True
app = DebuggedApplication(app, evalex=True)
return app
Puis lancez:
uwsgi --ini uwsgi-dev-example.ini
Remarque: Cet exemple active également le débogueur.
J'ai choisi cette voie pour imiter le plus possible la production avec ma configuration nginx. Si vous exécutez simplement l'application flask avec son serveur Web intégré derrière nginx, cela entraînerait une erreur de passerelle incorrecte.
Quelques mises à jour pour Flask 1.0
l’approche de base pour le rechargement à chaud est la suivante:
_$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
_
FLASK_ENV=development
_ (pas _FLASK_DEBUG=1
_)flask run --debugger
_ uniquement pour vous assurer qu'il est activé.FLASK_APP
_ et _FLASK_ENV
_ si vous avez un fichier _.env
_ à la racine du projet (en raison de une intégration avec python-dotenv
)Pour cela, dans PyCharm, définissez la section 'Variables d'environnement' comme suit:
PYTHONUNBUFFERED = 1; FLASK_DEBUG = 1
Pour Flask 'configurations d'exécution/de débogage'