Django部署到Elastic Beanstalk时看不到环境变量

cor*_*nus 6 python django amazon-web-services django-rest-framework amazon-elastic-beanstalk

我正在尝试在Elastic Beanstalk上设置Django / DRF应用程序,由于任何原因,Django都无法看到所需的环境变量。登录时,通过使用可以看到它们很好

$ eb ssh
$ cat /opt/python/current/env
Run Code Online (Sandbox Code Playgroud)

除了使用RDS的相对敏感的代码外,我还可以看到它们,只需使用即可$eb printenv

所有这些似乎已设置并正常工作。但是,Django喜欢在启动时立即读取环境,并且似乎尚未设置环境变量。我已经尝试过简单地插入print(os.environ)in settings.py,当我这样做时,我发现了一大堆不需要的环境变量,也没有'SUPERVISOR_GROUP_NAME': 'httpd'我自己设置的变量DJ_SECRET_KEY

此后,我更改了代码以报告加载设置时不存在特定环境变量的情况,并从最近一次运行中生成了以下代码:

[Wed Nov 23 15:56:38.164153 2016] [:error] [pid 15708] DJ_SECRET_KEY not in environment; falling back to hardcoded value.
[Wed Nov 23 15:56:38.189717 2016] [:error] [pid 15708] RDS_DB_NAME not in environment; falling back to sqlite
[Wed Nov 23 15:56:38.189751 2016] [:error] [pid 15708] AWS_STORAGE_BUCKET_NAME not in environment; falling back to local static storage.
Run Code Online (Sandbox Code Playgroud)

同样,这些变量是在设置中设置的,它们与EB给我的任何其他报告工具一起显示。它们只是没有设置时间,以便Django在启动和读取时读取它们settings.py

看起来很接近这个问题,但实际上并不相同:我知道在ssh-ing到eb实例时如何查看/将环境变量加载到shell中。当我需要它们进行实际项目时,它们只是没有出现。

几乎完全是我遇到的问题,但是正确的可接受答案对我来说毫无意义,并且投票最高的答案并不适用。这些文件已经在git中。

我应该如何配置东西以便Django可以看到环境变量?

cor*_*nus 4

鉴于 EB 将所有这些环境变量存储在规范位置作为 bash 脚本,我最终只是让 bash 执行该脚本,并根据解析的结果更新环境。

get_eb_env.py与我的settings.py. 其主要内容:

import os
import subprocess

ENV_PATH = '/opt/python/current/env'

def patch_environment(path=ENV_PATH):
    "Patch the current environment, os.environ, with the contents of the specified environment file."
    # mostly pulled from a very useful snippet: http://stackoverflow.com/a/3505826/504550
    command = ['bash', '-c', 'source {path} && env'.format(path=path)]

    proc = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True)
    proc_stdout, _ = proc.communicate(timeout=5)

    # proc_stdout is just a big string, not a file-like object
    # we can't iterate directly over its lines.
    for line in proc_stdout.splitlines():
        (key, _, value) = line.partition("=")
        os.environ[key] = value
Run Code Online (Sandbox Code Playgroud)

然后,我只需导入并patch_environment()调用我的settings.py.