web-dev-qa-db-fra.com

Flask et uWSGI - impossible de charger l'application 0 (mountpoint = '') (appelable introuvable ou erreur d'importation)

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)
61
Tampa

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.

38
Jeff Tratner

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.

187
Milimetric

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.

0
B--rian