我使用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加载应用程序时执行初始化代码?
答案 0 :(得分:1)
它发生在第一个请求上,因为默认情况下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脚本文件。
BTW,如果你还没有使用mod_wsgi守护进程模式(WSGIDaemonProcess
指令),并强制主解释器上下文(WSGIApplicationGroup %{GLOBAL}
指令),你应该是,因为这是首选设置。