【问题标题】:Flask application on uwsgi gives a TypeError: 'Flask' object is not iterableuwsgi 上的 Flask 应用程序给出 TypeError: 'Flask' object is not iterable
【发布时间】:2016-03-22 15:43:55
【问题描述】:

我在 Arch Linux 上的 virtualenv 中运行 Python 3.5 上的 Python/Flask 应用程序。该应用程序由通过套接字连接到 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 box 上使用内置 HTTP 服务器启动应用程序时,一切正常。

问题是:添加调试语句后,很明显错误发生在 Flask 代码本身的某个点上,而不是在我的应用程序中。如何在此处获取堆栈跟踪以更好地进行故障排除?

【问题讨论】:

  • 你能显示定义你传递给uwsgi的可调用文件的文件吗?
  • 更新了相关方法,如有需要我可以添加更多方法。
  • 您的问题启发了我添加更多调试代码,我很快就发现了问题。谢谢这个问题!这让我重新思考了整个设置。我会添加一个答案。

标签: python flask uwsgi


【解决方案1】:

一个 WSGI 应用程序(Flask 就是)是一个可调用对象。这就是 uWSGI 期望传递给callable 的内容。您正在传递一个应用工厂,它也是可调用的,但您需要将该调用的 result 传递给它,因为应用工厂本身不是 WSGI 应用程序。

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

module = my_app:create_app()

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

【讨论】:

    【解决方案2】:

    找到答案:我用callable = create_app 配置了uwsgi,这是一个返回Flask“应用程序”的函数。但是 uwsgi 实际上想要应用程序对象。

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多