Flask application on uwsgi gives a TypeError: 'Flask' object is not iterable
Flask application on uwsgi gives a TypeError: 'Flask' object is not iterable
我 运行正在 Python/Flask 上 Python 3.5 上的应用程序在 Arch Linux 上的 virtualenv 中。该应用程序由通过套接字连接到 Nginx 的 uwsgi 服务器 运行。
当我执行请求时,出现以下 uwsgi 错误:
Mar 23 02:38:19 saltminion1.local uwsgi[20720]: TypeError: 'Flask' object is not iterable
这是 uwsgi 配置使用的可调用函数:
def create_app(config=None, import_name=None):
if import_name is None:
import_name = DefaultConfig.PROJECT
app = Flask(import_name, instance_path=INSTANCE_FOLDER_PATH, instance_relative_config=True)
configure_app(app, config)
configure_database(app)
configure_logging(app)
configure_error_handlers(app)
configure_blueprints(app)
return app
当我在本地 OS X 开发工作站和 Arch/Ubuntu vagrant boxes 上使用内置 HTTP 服务器启动应用程序时,一切正常。
问题是:添加调试语句后,很明显错误发生在 Flask 代码本身的某个位置,而不是在我的应用程序中。如何在此处获取堆栈跟踪以更好地进行故障排除?
找到答案:我用 callable = create_app
配置了 uwsgi,这是 returns Flask "application" 的一个功能。但是 uwsgi 实际上想要应用程序对象。
一个 WSGI 应用程序(Flask 是)是一个可调用对象。这就是 uWSGI 期望传递给 callable
的内容。您正在传递一个应用工厂,它也是可调用的,但您需要将调用的 结果 传递给它,因为应用工厂本身不是 WSGI 应用程序。
工厂函数可以在配置中直接调用。 module
和 callable
选项也可以合并为 module
.
module = my_app:create_app()
这告诉uWSGI导入my_app
,找到my_app.create_app
,然后调用它。 Flask 应用程序的结果是实际用作可调用项的内容。
我 运行正在 Python/Flask 上 Python 3.5 上的应用程序在 Arch Linux 上的 virtualenv 中。该应用程序由通过套接字连接到 Nginx 的 uwsgi 服务器 运行。
当我执行请求时,出现以下 uwsgi 错误:
Mar 23 02:38:19 saltminion1.local uwsgi[20720]: TypeError: 'Flask' object is not iterable
这是 uwsgi 配置使用的可调用函数:
def create_app(config=None, import_name=None):
if import_name is None:
import_name = DefaultConfig.PROJECT
app = Flask(import_name, instance_path=INSTANCE_FOLDER_PATH, instance_relative_config=True)
configure_app(app, config)
configure_database(app)
configure_logging(app)
configure_error_handlers(app)
configure_blueprints(app)
return app
当我在本地 OS X 开发工作站和 Arch/Ubuntu vagrant boxes 上使用内置 HTTP 服务器启动应用程序时,一切正常。
问题是:添加调试语句后,很明显错误发生在 Flask 代码本身的某个位置,而不是在我的应用程序中。如何在此处获取堆栈跟踪以更好地进行故障排除?
找到答案:我用 callable = create_app
配置了 uwsgi,这是 returns Flask "application" 的一个功能。但是 uwsgi 实际上想要应用程序对象。
一个 WSGI 应用程序(Flask 是)是一个可调用对象。这就是 uWSGI 期望传递给 callable
的内容。您正在传递一个应用工厂,它也是可调用的,但您需要将调用的 结果 传递给它,因为应用工厂本身不是 WSGI 应用程序。
工厂函数可以在配置中直接调用。 module
和 callable
选项也可以合并为 module
.
module = my_app:create_app()
这告诉uWSGI导入my_app
,找到my_app.create_app
,然后调用它。 Flask 应用程序的结果是实际用作可调用项的内容。