Eu encontrei uma solução usando o conteúdo de environ ['REQUEST_URI'] e verifiquei no arquivo python.
Mais detalhes você pode encontrar aqui: link
Eu tenho um servidor apache2 com mod-wsgi ativo, mas não consigo obter a variável de ambiente PYTHON_EGG_CACHE.
Aqui as linhas importantes do meu 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
E aqui o 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 ['']
O único environ['PYTHON_EGG_CACHE']
é apenas um teste, mas recebo um
KeyError: 'PYTHON_EGG_CACHE'
Eu também tentei seguir, mas recebo o mesmo erro acima:
RewriteCond ${lowercase:%{REQUEST_URI}} ^/svn/([^/]+)
RewriteRule . - [E=trac.svn_path:/var/trac/envs/%1]
O que está errado?
Obrigado por qualquer conselho.
EDIT: Depois de algumas pesquisas eu acho que encontrei o problema. O mod_dav é configurado para o local / svn e processa o pedido imediatamente, então o reescrito e o rewriterule serão ignorados.
Existe alguma possibilidade de definir variáveis de ambiente com mod_dav?
Eu encontrei uma solução usando o conteúdo de environ ['REQUEST_URI'] e verifiquei no arquivo python.
Mais detalhes você pode encontrar aqui: link
Foi assim que eu fiz no meu site django, onde o caminho é definido no arquivo do apache (como MY_PATH). Observe que eu copio para a variável 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)
Como copiei a variável de ambiente para o os.environ, agora posso usá-la (por exemplo) no arquivo de configurações. Observe que eu defini todas as variáveis os.environ
antes de incluir as configurações. Nas configurações eu entendi assim:
import os
PATH = os.environ['MY_PATH']
SetEnv
geralmente só define variáveis de ambiente de processo ao usar CGI. Para mod_wsgi, as variáveis SetEnv
entram no ambiente WSGI de solicitação e não no ambiente de processo.
Assim, eles não são acessíveis a partir do escopo global no script WSGI e, mesmo no aplicativo que pode ser chamado, você precisa acessá-los do dicionário environ passado como argumento.