初始化 Flask 应用 运行 Apache 和 mod_wsgi
Initialising a Flask app running with Apache and mod_wsgi
我在 Apache 下使用 mod_wsgi 获得了一个 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 的 process/interpreter 上下文应用程序将 运行 预加载 WSGI 脚本文件。
顺便说一句,如果你还没有使用 mod_wsgi 守护进程模式(WSGIDaemonProcess
指令),并强制使用主解释器上下文(WSGIApplicationGroup %{GLOBAL}
指令),你应该,因为这是首选设置。
我在 Apache 下使用 mod_wsgi 获得了一个 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 的 process/interpreter 上下文应用程序将 运行 预加载 WSGI 脚本文件。
顺便说一句,如果你还没有使用 mod_wsgi 守护进程模式(WSGIDaemonProcess
指令),并强制使用主解释器上下文(WSGIApplicationGroup %{GLOBAL}
指令),你应该,因为这是首选设置。