Mod-wsgi 调用 Flask 工厂函数两次

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

我正在尝试构建一个 Flask 应用程序并使用 mod_wsgi 服务器进行托管。我使用工厂函数来创建 Flask 应用程序,但我观察到 mod-wsgi 在初始化时在同一进程中调用工厂函数两次。

为了演示这一点,我在工厂函数中添加了一些打印语句,当我启动 wsgi 服务器时,它们会在 apache 日志中打印两次。我想在工厂函数中启动一些后台线程,但如果 mode_wsgi 调用工厂两次,它将启动多个我不想要的后台线程。

有人可以告诉我为什么 mod_wsgi 在应用程序初始化时调用 Flask 工厂函数两次以及如何停止它?我正在生产模式下运行 Flask。

阿帕奇日志:

root@728d78f92b2a:/tmp/mod_wsgi-localhost:9090:0# cat error_log 
[Fri Sep 29 20:23:45.172948 2023] [mpm_event:notice] [pid 6:tid 281472976408608] AH00489: Apache/2.4.57 (Debian) mod_wsgi/4.9.4 Python/3.8 configured -- resuming normal operations
[Fri Sep 29 20:23:45.172965 2023] [wsgi:error] [pid 8:tid 281472976408608] mod_wsgi (pid=8): Unsupported locale setting en_US.UTF-8 specified for daemon process group localhost:9090. Consider using 'C.UTF-8' as fallback setting.
[Fri Sep 29 20:23:45.173002 2023] [core:notice] [pid 6:tid 281472976408608] AH00094: Command line: 'apache2 (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:9090:0/httpd.conf -D MOD_WSGI_KEEP_ALIVE -D MOD_WSGI_MPM_ENABLE_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_WORKER_MODULE -D MOD_WSGI_MPM_EXISTS_PREFORK_MODULE -D FOREGROUND'
[Fri Sep 29 20:23:45.289648 2023] [wsgi:error] [pid 8:tid 281472976408608] inside factory function!
[Fri Sep 29 20:23:45.289670 2023] [wsgi:error] [pid 8:tid 281472976408608] flask-env production
[Fri Sep 29 20:23:45.290326 2023] [wsgi:error] [pid 8:tid 281472976408608] inside factory function!
[Fri Sep 29 20:23:45.290338 2023] [wsgi:error] [pid 8:tid 281472976408608] flask-env production

初始化.py

from flask import Flask
from src.app import create_app

application = create_app()

应用程序.py

from flask import Flask
import os

def create_app():
    app = Flask('sample-app')
    
    print("inside factory function!")
    print(f"flask-env {os.environ['FLASK_ENV']}")
    # start bg threads here
    # app initialization

    @app.route('/', methods=['GET'])
    def hello_world():
        return "Hello! this is a sample flask app!"
    
    return app

从 dockerfile 运行 mod-wsgi:

...
...
CMD ["mod_wsgi-express", "start-server", "/sample-flask-app/src/__init__.py", "--user", "www-data", "--group", "www-data", "--port", "9090"]

我原以为 mod_wsgi 每个进程只调用一次工厂函数,但事实并非如此。我不提供任何自定义 apache 配置

python-3.x flask mod-wsgi wsgi factory-pattern
1个回答
0
投票

我最好的猜测是它被调用了两次,因为您的工厂函数位于目录的

__init__.py
文件中。

项目结构中的某些后续导入可能会再次从

src
目录中导入某些内容,这会导致
__init__.py
模块再次执行,然后再次调用 create_app()。

在不知道你的完整设置的情况下很难判断,但作为第一次尝试,我建议将由 mod_wsgi 运行的代码移动到目录之外的另一个 python 模块中

__init__.py

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