python - 初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序

标签 python apache flask mod-wsgi

我有一个使用 mod_wsgi 在 Apache 下运行的 Flask 应用程序。应用程序需要进行一些初始化,包括在接收任何请求之前设置一些需要在请求处理程序内部访问的顶级变量。目前,此初始化代码只是 app.py 中请求处理方法之前的顶级语句:

from flask import Flask, Response, request

<other app imports>

APP = Flask(__name__)

# initialisation code

@APP.route(<URL for request #1>)
def request_handler_1():
    # request handler code

@APP.route(<URL for request #2>)
def request_handler_2():
    # request handler code

应用程序的 wsgi 文件如下所示:

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/myapp")

from myapp.app import APP as application
application.secret_key = <secret key>

我注意到在收到第一个请求之前不会调用初始化代码。在收到任何请求之前,如何在 mod_wsgi 加载应用程序时执行初始化代码?

最佳答案

这是在第一个请求时发生的,因为默认情况下 mod_wsgi 只会在第一个请求到达时加载您的 WSGI 脚本文件。也就是说,它会延迟加载您的 WSGI 应用程序。

如果您想在进程首次启动时强制它加载您的 WSGI 应用程序,那么您需要告诉 mod_wsgi 这样做。

如果您有如下配置:

WSGIDaemonProcess myapp
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / /some/path/app.wsgi

将其更改为:

WSGIDaemonProcess myapp
WSGIScriptAlias / /some/path/app.wsgi process-group=myapp application-group=%{GLOBAL}

只有在 WSGIScriptAlias 上指定了进程组和应用程序组,而不是使用单独的指令时,mod_wsgi 才能预先知道 WSGI 应用程序将在哪个进程/解释器上下文中运行并因此预加载 WSGI 脚本文件。

顺便说一句,如果您尚未使用 mod_wsgi 守护进程模式(WSGIDaemonProcess 指令),并强制使用主解释器上下文(WSGIApplicationGroup %{GLOBAL} 指令) ,您应该这样做,因为这是首选设置。

关于python - 初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42439210/

相关文章:

python - Django:没有名为 context_processors 的模块,基本 URL

python - 如何在Python中进行参数匹配、捕获

python - 如何同时选择数组的所有奇数行和所有偶数列

java - 是否可以排除apache访问日志中指定的GET参数?(W7开发环境)

java - 在单元测试期间,如何将所有输出记录到控制台而不是日志文件

mysql - 高效地将WTForm提交写入mysql

访问 Flask 请求参数的 Pythonic 方式

python - 如何检查对象是否已在python中初始化?

apache - 表单提交后 IE8 帖子正文变空

docker - Flask应用程序Docker Nginx