Django:SECRET_KEY的环境变量无法工作

3

我在prod.py中有SECRET_KEY = os.environ['SECRET_KEY'],并且在我的.bashrc中有SECRET_KEY=secret_string。这会导致502错误,但如果我设置SECRET_KEY="secret_string",它就可以工作。如何使用环境变量来解决这个问题?

我通过sudo service gunicorn restart启动gunicorn,并且有一个upstart脚本。

下面是cat /proc/<PID>/environ的输出:

PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin^@TERM=linux^@UPSTART_JOB=gunicorn^@UPSTART_INSTANCE=^@
2个回答

6

您需要做的是:

export SECRET_KEY=secret_string

在您的.bashrc文件中。如果您只需执行以下操作:
SECRET_KEY=secret_string

这个变量仅在当前进程可用,但当你运行django服务器/控制台时,子进程无法使用此变量。export 可以使该变量在子进程中也可用。


1
我添加了 export 并且 source.bashrc,但是当我重新启动 gunicorn 时它仍然不起作用。 - sac7e
1
@sac7e:.bashrc 只影响 bash 登录 shell。你是从你的 shell 启动 gunicorn 吗? - Andrea Corbellini
另外,你是否定义了DJANGO_SETTINGS_MODULE环境变量?请参考https://docs.djangoproject.com/en/1.9/topics/settings/#envvar-DJANGO_SETTINGS_MODULE。 - Shang Wang
@ShangWang:我认为它是在wsgi.py中定义的, os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.prod") - sac7e
我不确定。最坏的情况下,你可以在你的upstart脚本中执行source ~/.bashrc。那应该可以工作。 - Shang Wang
显示剩余2条评论

4

.bashrc 只影响 bash 登录 shell,启动脚本不受其影响。

你应该将 export SECRET_KEY=... 行复制到你的启动脚本顶部。


添加 export SECRET_KEY=... 是处理这个问题的唯一方法吗?如果我使用 django-environ,如何将 .env 中的环境变量导出到初始化脚本中。另一个问题是,在 /proc/<PID>/environ 中没有 "DJANGO_SETTINGS_MODULE",那么 gunicorn 进程如何知道设置文件的位置?我认为唯一的解释是在 wsgi.py 中的 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.prod")。你怎么看? - sac7e
是的,setdefault()就是解决方案。使用export SECRET_KEY并不是唯一的方法(而且我不建议这样做:环境变量不应该包含机密信息,因为它们可能会泄漏)。我通常把我的密钥和数据库凭据存储在一个名为localsettings.py的文件中。这个文件没有被版本控制(被git忽略),并且由我的主要DJANGO_SETTINGS_MODULE导入。 - Andrea Corbellini
我仍然更喜欢环境变量,并且我找到了另一种方法:就像在wsgi.py中的os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.prod"),我在我的repo中定义.env并在设置文件中解析它。无论如何,非常感谢。 - sac7e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接