Flask 和 uWSGI - 无法加载应用0 (挂载点 ='') (找不到可调用项或导入错误)

78

使用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 __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)
3个回答

204

我对已接受的解决方案有问题,因为我的flask应用程序在名为app的变量中。你可以通过在你的wsgi中只添加这个来解决:

from module_with_your_flask_app import app as application

所以问题就是uwsgi期望一个名为application的变量。


47
这段文字应该以粗体、100号字体在文件中发布! - ankush981
24
如果您直接调用uwsgi,则可以在ini文件中使用callable = app或使用--callable app标志。 - Matt
这恰恰就是问题所在。我赞同这个想法,即在示例开头应该使用64px字体 :) 如果即使语法正确,它仅检测“application.run()”而不检测其他内容是没有意义的。 - Juha Untinen
1
嘿,第一个提交拉取请求将其添加到文档中的人将获得一个饼干(我做的饼干很好吃)。 - Milimetric
这对于在 Flask 应用程序工厂配置中通过 create_app()__init__.py 中进行 gevent 和 psycogreen 的早期修补非常有用。应用程序 = 应用程序...谁能想到 uWSGI 文档快速入门是如此字面的... - Tim Pozza

53

uWSGI不会将您的应用程序加载为__main__,因此它永远不会找到app(因为只有在应用程序作为名称__main__运行时才会加载)。因此,您需要在if __name__ == "__main__":块之外导入它。

真正简单的更改:

from app import app as application  # for example, should be app

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

现在你可以直接使用 python run.py 运行应用程序,或者按照你的方式通过uWSGI运行它。

注意:如果你设置了 --callable myapp,你需要将 as application 改为 myapp(默认情况下,uwsgi 期望使用 application)。


1
这真的帮了我很多——我正在重用别人使用Flask封装RESTful API的代码,以便在我想要的服务周围运行,但是我无论如何都想不通为什么它可以正常工作,除非在wsgi下运行。它有许多关键参数设置在if name == "main"下,我将它们移动到代码的主要部分,只留下app.run()语句,现在它可以正常工作了。 - Chaffelson
5
这还不够,uwsgi需要一个application而不是app,因此代码应该改为:else: application = app - stelios
@Jeff Tratner:请考虑更改已接受的答案(鉴于stelios的评论)。 - B--rian
如果您查看最初的问题,用户列出了 --callable app,这就是为什么这是合适的原因。通常我猜默认值是 application。也许我们应该编辑问题和答案。 - Jeff Tratner

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 是关键的部分。

注:这里的应用指的是IT应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接