提问人:Kevin123 提问时间:9/30/2023 更新时间:10/4/2023 访问量:12
Mod-wsgi 调用 flask 工厂函数两次
Mod-wsgi calls flask factory function twice
问:
我正在尝试构建一个烧瓶应用程序并使用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配置
答:
0赞
xArbisRox
10/4/2023
#1
我最好的猜测是它被调用了两次,因为您的工厂函数在目录的文件中。__init__.py
可能是项目结构中的一些后续导入再次从目录中导入某些内容,这会导致模块的另一次执行,然后再次调用 create_app()。src
__init__.py
在不了解您的完整设置的情况下很难分辨,但作为第一次尝试,我建议将代码(应由 mod_wsgi 运行)移动到目录以外的另一个 python 模块中__init__.py
评论