Назад | Перейти на главную страницу

Где переменная окружения?

У меня есть сервер apache2 с активным модулем mod-wsgi, но я не могу получить переменную среды 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?

Вот как я сделал это на своем сайте django, где путь указан в файле apache (как MY_PATH). Обратите внимание, что я копирую его в переменную 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, и даже в вызываемом приложении вы должны получить к ним доступ из окружающая среда словарь передан как аргумент.

Я нашел решение, используя содержимое Environment ['REQUEST_URI'] и проверьте это в файле python.
Более подробную информацию вы можете найти здесь: http://trac-hacks.org/ticket/8525