2017-02-24 102 views
1

我有一个使用mod_wsgi在Apache下运行的Flask应用程序。该应用程序需要做一些初始化,包括设置一些顶级变量,这些变量在请求处理程序内部需要被访问,然后才会收到请求。目前,这个初始化代码是app.py只是顶级声明请求处理方法之前:初始化使用Apache和mod_wsgi运行的Flask应用程序

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

请显示您的设置代码示例。 – MKesper

+0

这只是设置默认编码,定义'app.py'内的请求处理程序所需的常量并设置日志记录。 –

+0

我将所有初始化代码从应用程序移动到程序包init,并从Apache日志中,我仍然可以看到应用程序wsgi代码在收到第一个请求时首先执行。当应用程序由mod_wsgi加载时,肯定会有这样做的方式。 –

回答

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脚本文件。如果您还没有使用mod_wsgi守护进程模式(WSGIDaemonProcess指令),并强制执行主解释器上下文(WSGIApplicationGroup %{GLOBAL}指令),那么您应该这样做,因为这是首选设置。

+0

我还有一个问题 - 我遵循了关于使用守护进程模式和使用全局应用程序组指令的建议。但我希望我的Flask应用程序使用多个进程或线程处理多个请求。目前我的应用程序的conf文件如下所示:'' 'ServerName localhost' 'WSGIDaemonProcess myapp' 'WSGIScriptAlias//var/www/myapp/myapp.wsgi process-group = myapp application- group =%{GLOBAL}' 'WSGIApplicationGroup%{GLOBAL}' –

+0

你看过WSGIDaemonProcess指令的文档吗? http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html –

相关问题