2017-02-24 133 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 –

相關問題