2017-06-21 23 views
0

我试图从Apache配置读取数据库设置并出现错误。我尝试了很多其他问题的解决方案,但看起来这可能是Django 1.11版本问题。在Django读取Apache配置变量槽wsgi时遇到困难1.11

这就是我所拥有的。

在httpd.conf:

<VirtualHost *:80> 
    .... 

    SetEnv DB_NAME XYZ 
    SetEnv DB_USER abc 

    .... 
</VirtualHost> 

在wsgi.py:

import os, sys 
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 
PROJECT_DIR = os.path.abspath(os.path.join(BASE_DIR, '..')) 

sys.path.append(PROJECT_DIR) 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' 

import django.core.handlers.wsgi 
_application = django.core.handlers.wsgi.WSGIHandler() 

env_variables_to_pass = ['DB_NAME', 'DB_USER', ] 

def application(environ, start_response): 
    for var in env_variables_to_pass: 
    os.environ[var] = environ.get(var, '') 
    return _application(environ, start_response) 

在settings.py:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': os.environ['DB_NAME'], 
     'USER': os.environ['DB_USER'], 

     ...... 
     }, 
    } 

当我运行我的应用程序,我得到'内部服务器错误'。

这是在apache_error.log:

[wsgi:error] raise KeyError(key) from None\r 
[wsgi:error] KeyError: 'DB_NAME'\r 

}

回答

0

SetEnv只设置每个请求的WSGI ENVIRON字典中的值,而不是全过程的环境变量。您需要设置wsgi.py文件中的进程环境变量,或者从第一次导入wsgi.py文件的副作用处理的Python代码文件或配置文件中设置进程环境变量。

Apache系统配置中唯一可以设置进程范围环境变量的地方是envvars文件,但并非Linux系统上的所有Apache发行版都支持该功能。它也不被推荐,因为它为整个Apache设置它们,而不是在Apache下运行单个应用程序。