web-dev-qa-db-ja.com

Flask and uWSGI-app 0(mountpoint = '')をロードできません(呼び出し可能が見つからないか、インポートエラー)

UWSGIを使用してFlask=を開始しようとすると、以下のエラーが表示されます。開始方法は次のとおりです。

>  # cd ..
>     root@localhost:# 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 __== '__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)
61
Tampa

uWSGIはアプリを__main__としてロードしないため、appを見つけることはありません(アプリが__main__として実行された場合にのみロードされるため)。したがって、if __== "__main__":ブロックの外部にインポートする必要があります。

本当に簡単な変更:

from app import app

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

これで、python run.pyを使用してアプリを直接実行したり、uWSGIを使用してアプリを実行したりできます。

38
Jeff Tratner

私のflask appはappという変数にあったため、受け入れられたソリューションに問題がありました。これをwsgiに入れるだけで解決できます。

from module_with_your_flask_app import app as application

そのため、問題は単に、uwsgiがapplicationという変数を期待していることでした。

187
Milimetric

Flask applicationの次の最小限の作業例の最後の2行を省略した場合、uWSGIエラーunable to load app 0 (mountpoint='') (callable not found or import error)が発生しました

from flask import Flask
app = Flask(__name__)

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

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

繰り返しますが、application = app.serverはここで重要な部分です。

0
B--rian