2017-02-24 51 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に指示する必要があります。

設定を持っている場合のように:それは、両方のプロセスグループとアプリケーショングループは、むしろ別のディレクティブを使用するよりも、WSGIScriptAliasに指定されている場合にのみです

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

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

に変更し、それをmod_wsgiは、WSGIアプリケーションがどのプロセス/インタプリタ・コンテキストを実行するかを知ることができ、WSGIスクリプト・ファイルをプリロードすることができます。

modwsgiデーモンモード(WSGIDaemonProcessディレクティブ)をまだ使用しておらず、メインインタープリタコンテキスト(WSGIApplicationGroup %{GLOBAL}ディレクティブ)を強制的に使用していた場合は、そのように設定する必要があります。

+0

もう1つの質問があります。デーモンモードの使用とグローバルアプリケーショングループ指令の使用についての提案に従ってきました。しかし、私は私のFlaskアプリが複数のプロセスやスレッドを使って複数のリクエストを処理することを望みます。現時点では、私のアプリケーションのconfファイルは次のようになります: '''ServerName localhost' ' WSGIDaemonProcess myapp' 'WSGIScriptAlias /var/www/myapp/myapp.wsgi process-group = myapp application-グループ=%{GLOBAL} ' ' WSGIApplicationGroup%{GLOBAL} ' –

+0

WSGIDaemonProcessディレクティブのドキュメントを見ましたか? http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html –

関連する問題