环境变量在哪里?

环境变量在哪里?

我有一个启用了 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']只是一次测试,但我得到了

密钥错误:‘PYTHON_EGG_CACHE’

我也尝试了以下操作,但收到与上述相同的错误:

        RewriteCond ${lowercase:%{REQUEST_URI}} ^/svn/([^/]+)
        RewriteRule . - [E=trac.svn_path:/var/trac/envs/%1]

怎么了?

谢谢您的任何建议。

编辑:经过一番研究,我想我找到了问题所在。mod_dav 配置为位置 /svn,它会立即处理请求,因此 rewritecond 和 rewriterule 将被忽略。
是否有可能使用 mod_dav 设置环境变量?

答案1

这是我在 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']

答案2

SetEnv通常仅在使用 CGI 时设置进程环境变量。对于 mod_wsgi,SetEnv变量进入每个请求的 WSGI 环境而不是进程环境。
因此,它们无法从 WSGI 脚本中的全局范围访问,即使在应用程序可调用中,您也必须从以下位置访问它们:环境字典作为参数传递。

答案3

我通过使用内容找到了解决方案环境['REQUEST_URI']并在 python 文件中检查它。
您可以在这里找到更多详细信息:http://trac-hacks.org/ticket/8525

相关内容