Rechargement automatique de l'application Flask lorsque le code source change
Je sais pour un fait que la Fiole, en mode debug, permettra de détecter les changements .py fichiers de code source et les recharger lorsque de nouvelles demandes.
J'ai l'habitude de voir cela dans mon app tout le temps. Changer un peu de texte dans un @app.itinéraire la décoration de la section dans mon views.py fichier, et j'ai pu voir les changements dans le navigateur lors de l'actualisation.
Mais tout d'un coup (ne me souviens pas ce qui a changé), cela ne semble pas fonctionner.
Q: Où vais-je tort?
Je suis en cours d'exécution sur un OSX 10.9 système avec un VENV l'installation à l'aide de Python 2.7. J'utilise foreman start
dans ma racine du projet pour le faire démarrer.
Application de la structure est comme ceci:
[Project Root]
+-[app]
| +-__init__.py
| +- views.py
| +- ...some other files...
+-[venv]
+- config.py
+- Procfile
+- run.py
Les fichiers ressembler à ceci:
# Procfile
web: gunicorn --log-level=DEBUG run:app
# config.py
contains some app specific configuration information.
# run.py
from app import app
if __name__ == "__main__":
app.run(debug = True, port = 5000)
# __init__.py
from flask import Flask
from flask.ext.login import LoginManager
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.mail import Mail
import os
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
#mail sending
mail = Mail(app)
lm = LoginManager()
lm.init_app(app)
lm.session_protection = "strong"
from app import views, models
# app/views.py
@app.route('/start-scep')
def start_scep():
startMessage = '''\
<html>
<header>
<style>
body { margin:40px 40px;font-family:Helvetica;}
h1 { font-size:40px; }
p { font-size:30px; }
a { text-decoration:none; }
</style>
</header>
<p>Some text</p>
</body>
</html>\
'''
response = make_response(startMessage)
response.headers['Content-Type'] = "text/html"
print response.headers
return response
source d'informationauteur HanSooloo
Vous devez vous connecter pour publier un commentaire.
La question ici, comme indiqué dans d'autres réponses, c'est qu'il regarde comme vous avez déplacé à partir
python run.py
àforeman start
ou vous avez changé votreProcfile
deà
Lorsque vous exécutez
foreman start
il fonctionne tout simplement les commandes que vous avez spécifié dans l'Procfile
. (Je suppose que vous travaillez avec Heroku, mais même si c'est pas, c'est bien parce que c'est imiter ce qui va s'exécuter sur votre serveur/Heroku dyno/whatever.)Alors maintenant, lorsque vous exécutez
gunicorn --log-level=DEBUG run:app
(viaforeman start
) vous êtes maintenant en cours d'exécution de votre application avecgunicorn
plutôt que de l'intégré dans le serveur web qui vient avecFlask
. Lerun:app
argument indiquegunicorn
à regarder dansrun.py
pour unFlask
instance nomméeapp
de l'importation, et de l'exécuter. C'est là que c'est amusant: depuis lerun.py
est importé,__name__ == '__main__'
estFalse
(voir plus ici), et ainsi deapp.run(debug = True, port = 5000)
n'est jamais appelée.C'est ce que vous voulez (au moins dans un contexte à la disposition du public) parce que le serveur web intégré à l'
Flask
utilisé lors de l'app.run()
est appelé a d'assez graves failles de sécurité. Le--log-level=DEBUG
peut-être aussi un peu décevantes puisqu'il utilise le mot "DEBUG", mais c'est seulement diregunicorn
de journalisation états à imprimer et à ignorer (vérifier la Python docs sur l'exploitation forestière.)La solution consiste à exécuter
python run.py
lors de l'exécution de l'application localement et de travail de débogage sur elle, et seulement exécuterforeman start
quand vous voulez imiter un environnement de production. Aussi, depuisgunicorn
ne doit importer laapp
objet, vous pouvez supprimer une certaine ambiguïté, et de changer votreProcfile
àVous pouvez également regarder dans Flacon De Script qui a un construit en commande
python manage.py runserver
qui exécute le construit en Flacon serveur en mode de débogage.La solution est de cesser d'utiliser
foreman start
comme indiqué dans les commentaires et exécuter directementpython run.py
.De cette façon, le
app.run
méthode avec ledebug=True
etuse_reloader=True
configuration des paramètres prennent effet.Exemple d'Application où application est notre demande et cette demande a été enregistrée dans le fichier start.py:
maintenant nous commençons l'application de la coque avec le drapeau --reload
et gunicorn de la recharge de l'application au moment où le fichier a été modifié automatiquement. Pas besoin de changer quoi que ce soit.
si vous aimeriez à l'exécution de cette application en arrière-plan ajouter le drapeau -D
Regarder le fichier de paramètres:
http://docs.gunicorn.org/en/latest/settings.html
toutes les options et les drapeaux s'y sont mentionnées. Amusez-vous!