Onde está a variável de ambiente?

2

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?

    
por CSchulz 21.02.2011 / 12:37

3 respostas

1

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

    
por 22.02.2011 / 17:33
4

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']
    
por 03.06.2012 / 20:34
2

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.

    
por 27.02.2011 / 08:44