アクティブなmod-wsgiを備えたApache2サーバーがありますが、環境変数PYTHON_Egg_CACHEを取得できません。
virtualhost.confの重要な行は次のとおりです。
DAV svn
SVNParentPath /var/svn
SVNListParentPath Off
WSGIProcessGroup sites
WSGIApplicationGroup %{GLOBAL}
SetEnv PYTHON_Egg_CACHE /var/trac/eggs
AuthType Basic
AuthName "Restricted SVN"
AuthBasicProvider wsgi
WSGIAuthUserScript /var/trac/cgi-bin/acctmgr_auth.wsgi
Require valid-user
そしてここにacctmgr_auth.wsgi:
import os, sys
os.environ['PYTHON_Egg_CACHE'] = PYTHON_Egg_CACHE
from trac.env import open_environment, Environment
acct_mgr = None
def check_password(environ, user, password):
global acct_mgr
# Try loading the env from the global cache, addit it if needed
environ['PYTHON_Egg_CACHE']
env = open_environment(environ['trac.env_path'], use_cache=True)
if acct_mgr is None:
from acct_mgr.api import AccountManager
acct_mgr = AccountManager
if acct_mgr(env).check_password(user, password):
return True
else:
return False
def groups_for_user(environ, user):
return ['']
シングルenviron['PYTHON_Egg_CACHE']
は単なるテストですが、
KeyError: 'PYTHON_Egg_CACHE'
。
私もフォローしようとしましたが、上記と同じエラーが発生します:
RewriteCond ${lowercase:%{REQUEST_URI}} ^/svn/([^/]+)
RewriteRule . - [E=trac.svn_path:/var/trac/envs/%1]
なにが問題ですか?
アドバイスありがとうございます。
編集:いくつかの研究の後、私は問題を見つけたと思います。 mod_davは場所/ svnに設定されており、リクエストをすぐに処理するため、rewritecondとrewriteruleは無視されます。
mod_davで環境変数を設定する可能性はありますか?
environ ['REQUEST_URI']のコンテンツを使用して解決策を見つけ、pythonファイルで確認しました。
詳細については、こちらをご覧ください: http://trac-hacks.org/ticket/8525
これは、パスがApacheファイルに(MY_PATHとして)設定されているDjangoサイトで行った方法です)。これをos.environ変数にコピーしていることに注意してください。
import os, sys, Django.core.handlers.wsgi
_application = Django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
path = environ['MY_PATH']
if path not in sys.path:
sys.path.append(path)
os.environ['MY_PATH'] = environ['MY_PATH']
from Django.conf import settings
settings.DEBUG = True
return _application(environ, start_response)
環境変数をos.environにコピーしたので、(たとえば)設定ファイルで使用できるようになりました。設定を含める前に、すべてのos.environ
変数を設定したことに注意してください。設定では、次のようになります。
import os
PATH = os.environ['MY_PATH']
SetEnv
は通常、CGIを使用する場合にのみプロセス環境変数を設定します。 mod_wsgiの場合、SetEnv
変数は、プロセス環境ではなく、リクエストごとのWSGI環境に入ります。
したがって、WSGIスクリプトのグローバルスコープからはアクセスできず、呼び出し可能なアプリケーションでも、引数として渡されたenvironディクショナリからアクセスする必要があります。