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

问题描述:

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

这是我使用的代码。

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') 

我什么都找不到。有什么建议吗?

谢谢

编辑:在Apache上运行mod_wsgi。

+0

你是如何运行服务器的? – Rohan 2013-05-06 09:15:14

+0

我使用mod_wsgi在Apache上运行我的项目。 – luistm 2013-05-06 09:18:35

+0

这些应该在虚拟主机文件中定义吗? – luistm 2013-05-06 09:27:54

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

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

我最近刚刚发现这一点我自己的原因。

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

  1. 使用Apache SETENV指令在你的虚拟主机配置,
  2. 设置环境变量运行Apache代码作为用户,或
  3. 告诉Apache运行wsgidaemon过程,您的用户。
+1

对于过程环境变量,这些都不会严格执行。 SetEnv指令只设置每个请求的WSGI环境变量而不处理环境变量。在Apache用户的环境中设置东西不会有帮助,因为Apache是​​以root身份启动的,并且继承了一个干净的默认主机环境。您不希望将内容添加到全局默认主机环境。而使用守护进程模式作为特定用户也无济于事,因为用户登录脚本永远不会执行,所以现在可以通过这种方式获取环境变量。 – 2015-07-21 08:41:59

+1

最简单的做法是将任何进程环境变量设置为加载的WSGI脚本文件的副作用。 – 2015-07-21 08:42:39