У меня есть сервер 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