Подтвердить что ты не робот

Flask и uWSGI - невозможно загрузить приложение 0 (mountpoint = '') (ошибка вызова или ошибка импорта)

Я получаю ошибку ниже, когда пытаюсь запустить Flask с помощью uWSGI. Вот как я начинаю:

>  # cd ..
>     [email protected]:# uwsgi --socket 127.0.0.1:6000 --file /path/to/folder/run.py --callable app -  -processes 2

Вот моя структура каталогов:

-/path/to/folder/run.py
      -|app
          -|__init__.py
          -|views.py
          -|templates
          -|static

Содержание /path/to/folder/run.py

if __name__ == '__main__':
   from app import app
   #app.run(debug = True)
   app.run()

Содержание /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)
4b9b3361

Ответ 1

uWSGI не загружает ваше приложение как __main__, поэтому он никогда не найдет app (так как он загружается только тогда, когда приложение запускается как имя __main__). Таким образом, вам нужно импортировать его вне блока if __name__ == "__main__":.

Действительно простое изменение:

from app import app

if __name__ == "__main__":
    app.run()

Теперь вы можете запускать приложение напрямую с помощью python run.py или запускать его через uWSGI, как у вас есть.

Ответ 2

У меня были проблемы с принятым решением, потому что мое флеш-приложение находилось в переменной под названием app. Вы можете решить это, поставив именно это в свой wsgi:

from module_with_your_flask_app import app as application

Таким образом, проблема заключалась в том, что uwsgi ожидает переменную с именем application.

Ответ 3

Ошибка uWSGI unable to load app 0 (mountpoint='') (callable not found or import error) произошла для меня, если я пропустил последние две строки следующего минимального рабочего примера для приложения Flask

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello world!"

if __name__ == "__main__":
    app.run()
else:
    application = app

Я знаю, что это уже косвенно говорилось в комментариях к другому ответу, но мне все еще потребовалось время, чтобы понять это, поэтому я надеюсь сэкономить время других.

В случае чистого приложения Python Dash я могу предложить следующий минимальный жизнеспособный фрагмент кода:

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 __name__ == "__main__":
    app.run_server(debug=True)

Опять же, application = app.server является важной частью здесь.