J'obtiens l'erreur ci-dessous lorsque j'essaie de démarrer Flask using uWSGI. Voici comment je commence:
> # cd ..
> root@localhost:# uwsgi --socket 127.0.0.1:6000 --file /path/to/folder/run.py --callable app - -processes 2
Voici ma structure de répertoires:
-/path/to/folder/run.py
-|app
-|__init__.py
-|views.py
-|templates
-|static
Contenu de /path/to/folder/run.py
if __== '__main__':
from app import app
#app.run(debug = True)
app.run()
Contenu de /path/to/folder/app/__init__.py
import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
#from flaskext.babel import Babel
from config import basedir
app = Flask(__name__)
app.config.from_object('config')
#app.config.from_pyfile('babel.cfg')
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.setup_app(app)
login_manager.login_view = 'login'
login_manager.login_message = u"Please log in to access this page."
from app import views
*** Operational MODE: preforking ***
unable to find "application" callable in file /path/to/folder/run.py
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (pid: 26972, cores: 1)
spawned uWSGI worker 2 (pid: 26973, cores: 1)
uWSGI ne charge pas votre application en tant que __main__
, donc il ne trouvera jamais le app
(puisque cela n'est chargé que lorsque l'application est exécutée en tant que nom __main__
). Ainsi, vous devez l'importer en dehors du if __== "__main__":
bloquer.
Changement vraiment simple:
from app import app
if __== "__main__":
app.run()
Vous pouvez maintenant exécuter l'application directement avec python run.py
ou exécutez-le via uWSGI comme vous l'avez.
J'ai eu des problèmes avec la solution acceptée parce que mon application flask était dans une variable appelée app
. Vous pouvez résoudre ce problème en mettant simplement ceci dans votre wsgi:
from module_with_your_flask_app import app as application
Le problème était donc simplement que uwsgi attend une variable appelée application
.
L'erreur uWSGI unable to load app 0 (mountpoint='') (callable not found or import error)
s'est produite pour moi si j'ai omis les deux dernières lignes de l'exemple de travail minimal suivant pour application Flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello world!"
if __== "__main__":
app.run()
else:
application = app
Je suis conscient que cela a déjà été implicitement dit dans les commentaires d'une autre réponse, mais il m'a encore fallu un certain temps pour comprendre cela, alors j'espère gagner du temps aux autres.
Dans le cas d'une pure application Python Dash, je peux offrir l'extrait de code viable minimal suivant:
import dash
import dash_core_components as dcc
import dash_html_components as html
app = dash.Dash()
app.layout = html.Div( html.H1(children="Hello World") )
application = app.server
if __== "__main__":
app.run_server(debug=True)
Encore une fois, le application = app.server
est la partie essentielle ici.