Gunicorn 不会启动 Flask 应用程序,因为“无法将 'app' 解析为属性名称或函数调用。”

问题描述 投票:0回答:1

我尝试在 docker 本地运行 Flask 应用程序,但遇到以下问题

app.py:

class App:
    '''Base flask app'''

    def __init__(self):
        self.app = Flask(__name__)
    
    @property
    def flask_app(self) -> Flask:
        '''Return flask app'''

        return self.app

app_instance = App()

我的 Dockerfile:

...
CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 app:app_instance.app

错误:

Failed to parse 'app_instance.app' as an attribute name or function call.
python flask gunicorn
1个回答
0
投票

错误消息表明gunicorn无法正确解析'app_instance.app'。这通常意味着gunicorn无法找到它需要运行的应用程序实例。

使用gunicorn命令时,需要指定gunicorn应服务的应用程序模块和Flask应用程序实例。格式通常为 module_name:instance_name。

在 Dockerfile 中,您尝试将 app_instance.app 传递给 Gunicorn,但由于 app_instance 是 App 类的实例而不是模块,因此这不会按预期工作。

解决此问题的一种方法是确保 Flask 应用程序实例可用作可导入的模块级变量。您可以修改 app.py 以拥有指向 Flask 应用程序的模块级变量。以下是调整 app.py 的方法:

from flask import Flask

class App:
    '''Base flask app'''

    def __init__(self):
        self.app = Flask(__name__)
    
    @property
    def flask_app(self) -> Flask:
        '''Return flask app'''
        return self.app

app_instance = App()
application = app_instance.flask_app  # Make the Flask app available as 'application'

然后,在 Dockerfile 中,您可以调整 CMD 以指向应用程序变量:

CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 app:application

通过这样做,您告诉gunicorn在应用程序模块中查找名为application的变量,该变量可以在模块级别访问并且可以导入。

© www.soinside.com 2019 - 2024. All rights reserved.