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

Mod-wsgi calls flask factory function twice

提问人:Kevin123 提问时间:9/30/2023 更新时间:10/4/2023 访问量:12

问:

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

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

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

Apache 日志:

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()

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 工厂模式

评论


答:

0赞 xArbisRox 10/4/2023 #1

我最好的猜测是它被调用了两次,因为您的工厂函数在目录的文件中。__init__.py

可能是项目结构中的一些后续导入再次从目录中导入某些内容,这会导致模块的另一次执行,然后再次调用 create_app()。src__init__.py

在不了解您的完整设置的情况下很难分辨,但作为第一次尝试,我建议将代码(应由 mod_wsgi 运行)移动到目录以外的另一个 python 模块中__init__.py