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 应用程序。

工厂函数可以在配置中直接调用。 modulecallable 选项也可以合并为 module.

module = my_app:create_app()

这告诉uWSGI导入my_app,找到my_app.create_app,然后调用它。 Flask 应用程序的结果是实际用作可调用项的内容。