2017-06-07 2 views
1
#main.py 
from flask import Flask 

app = Flask(__name__) 

if __name__ == '__main__':  
    print("before app run") 
    app.run() # , threaded=True host='0.0.0.0', debug=True, port=5000 

Run gunicorn comme suit:avant app.run() ne peut pas être exécuté dans gunicorn + flacon

gunicorn -b 0.0.0.0:8000 --preload main:app 

le résultat ne sera pas imprimé « avant application unn ». Comment puis-je exécuter le code d'impression? si je ne veux pas placer l'impression à l'extérieur de if __name__ == '__main__'

Répondre

1

Gunicorn n'exécute pas le fichier, mais le import. Cela signifie que __name__ != "__main__" et votre code ne sera jamais exécuté. Gunicorn appelle ensuite manuellement app.run() lui-même, après avoir importé votre fichier.

La solution est de vous assurer que votre code est exécuté au moment de l'importation:

> cat main.py 
from flask import Flask 

app = Flask(__name__) 

print "before main stanza" 
if __name__ == "__main__": 
    print "in main stanza" 
    app.run() 

Et puis en exécutant l'application:

> gunicorn -b 0.0.0.0:8000 --preload main:app 
before main stanza 
[2017-06-07 08:33:15 +0100] [8865] [INFO] Starting gunicorn 19.7.1 
[2017-06-07 08:33:15 +0100] [8865] [INFO] Listening at: http://0.0.0.0:8000 (8865) 
... 
1

En fait, ce imprimera before app run lorsque vous exécutez cette application avec python main.py

Il est impossible avec gunicorn si vous pouvez essayer before_first_request qui fera l'affaire

@app.before_first_request 
def execute_this(): 
    print("before app run")