【问题标题】:Having trouble reading Apache config variable trough wsgi in Django 1.11在 Django 1.11 中通过 wsgi 读取 Apache 配置变量时遇到问题
【发布时间】:2017-06-21 14:43:48
【问题描述】:

我正在尝试从 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'],

         ......
        },
    }

当我运行我的应用程序时,我收到“内部服务器错误”。

这是 apache_error.log 中的内容:

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

}

【问题讨论】:

    标签: python django apache wsgi setenv


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多