web-dev-qa-db-ja.com

環境変数はどこにありますか?

アクティブな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で環境変数を設定する可能性はありますか?

2
CSchulz

environ ['REQUEST_URI']のコンテンツを使用して解決策を見つけ、pythonファイルで確認しました。
詳細については、こちらをご覧ください: http://trac-hacks.org/ticket/8525

1
CSchulz

これは、パスが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']
4
Marius

SetEnvは通常、CGIを使用する場合にのみプロセス環境変数を設定します。 mod_wsgiの場合、SetEnv変数は、プロセス環境ではなく、リクエストごとのWSGI環境に入ります。
したがって、WSGIスクリプトのグローバルスコープからはアクセスできず、呼び出し可能なアプリケーションでも、引数として渡されたenvironディクショナリからアクセスする必要があります。

3