在 Django 1.11 中通过 wsgi 读取 Apache 配置变量时遇到问题
Having trouble reading Apache config variable trough wsgi in Django 1.11
我正在尝试从 Apache 配置中读取数据库设置,但出现错误。我尝试了其他问题的许多解决方案,但看起来这可能是 Django 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'],
......
},
}
当我 运行 我的应用程序时,我得到 'Internal Server Error'。
这是 apache_error.log 中的内容:
[wsgi:error] raise KeyError(key) from None\r
[wsgi:error] KeyError: 'DB_NAME'\r
}
SetEnv
只设置每个请求的 WSGI 环境字典值,而不是进程范围的环境变量。您需要从 wsgi.py
文件或作为首次导入 wsgi.py
文件的副作用处理的 Python 代码文件或配置文件设置进程环境变量。
Apache 系统配置中唯一可以设置进程范围环境变量的地方是 envvars
文件,但并非 Linux 系统上的所有 Apache 发行版都支持该文件。也不推荐,因为它为整个 Apache 设置它们,而不是为 Apache 下的单个应用程序 运行。
我正在尝试从 Apache 配置中读取数据库设置,但出现错误。我尝试了其他问题的许多解决方案,但看起来这可能是 Django 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'],
......
},
}
当我 运行 我的应用程序时,我得到 'Internal Server Error'。
这是 apache_error.log 中的内容:
[wsgi:error] raise KeyError(key) from None\r
[wsgi:error] KeyError: 'DB_NAME'\r
}
SetEnv
只设置每个请求的 WSGI 环境字典值,而不是进程范围的环境变量。您需要从 wsgi.py
文件或作为首次导入 wsgi.py
文件的副作用处理的 Python 代码文件或配置文件设置进程环境变量。
Apache 系统配置中唯一可以设置进程范围环境变量的地方是 envvars
文件,但并非 Linux 系统上的所有 Apache 发行版都支持该文件。也不推荐,因为它为整个 Apache 设置它们,而不是为 Apache 下的单个应用程序 运行。