无法在 Django 设置文件中获取环境变量

Posted

技术标签:

【中文标题】无法在 Django 设置文件中获取环境变量【英文标题】:Cannot get environment variables in Django settings file 【发布时间】:2013-04-30 00:23:32 【问题描述】:

我正在尝试读取 Django 设置中的一些环境变量,这些环境变量是我在 /home/user/.bashrc 中定义的(后者在 /etc/bash.bashrc 中),但我得到的只是一个 KeyError 异常。我知道我的环境变量已设置,因为我可以在终端中打印它们(echo $VAR_NAME)。这应该是微不足道的。

这是我正在使用的代码。

from django.core.exceptions import ImproperlyConfigured

msg = "Set the %s environment variable"


def get_env_variable(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = msg % var_name
        raise ImproperlyConfigured(error_msg)

OS_DB_USER = get_env_variable('MY_USER')
OS_DB_PASS = get_env_variable('MY_PASS')
OS_DB_DB = get_env_variable('MY_DB')
OS_GAME_LOGS = get_env_variable('DIR_LOGS')

我就是找不到丢失的东西。有什么建议吗?

谢谢

编辑:使用 mod_wsgi 在 Apache 上运行。

【问题讨论】:

你是如何运行服务器的? 我正在使用 mod_wsgi 在 Apache 上运行我的项目。 这些应该在virtualhost文件中定义吗? 【参考方案1】:

我已经设法通过使用这个解决方案来解决我的问题:

http://drumcoder.co.uk/blog/2010/nov/12/apache-environment-variables-and-mod_wsgi/

【讨论】:

【参考方案2】:

我自己最近才发现了这个问题的原因。

当在 apache/mod_wsgi 下运行时,您的应用程序在不同的用户下运行,因此不会设置这些环境变量。您的选择是:

    在您的虚拟主机配置中使用 apache SetEnv 指令, 为 apache 运行您的代码的用户设置环境变量,或者 告诉 apache 以您的用户身份运行 wsgidaemon 进程。

【讨论】:

对于进程环境变量,这些都不会严格工作。 SetEnv 指令仅设置每个请求的 WSGI 环境变量,而不是进程环境变量。在 Apache 用户的环境中设置内容将无济于事,因为 Apache 以 root 身份启动并继承了干净的默认主机环境。您不想向全局默认主机环境添加东西。并且以特定用户身份使用守护程序模式也无济于事,因为用户登录脚本永远不会执行,因此现在可以通过这种方式获取环境变量。 最简单的做法是将任何进程环境变量设置为正在加载的 WSGI 脚本文件的副作用。

以上是关于无法在 Django 设置文件中获取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

tcl文件无法获取通过代码设置的环境变量[关闭]

如何在 Django 中获取更新的类变量值

Django“未配置设置”错误,无法定义环境变量 DJANGO_SETTINGS_MODULE

Visual Studio 无法识别环境变量的更改

Java 怎么设置环境变量

为啥make无法获取环境变量